正则表达式


[TOC]

元字符

下表包含了常见元字符的列表以及它们在正则表达式上下文中的行为:

字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"'\n' 匹配一个换行符。序列 '\\' 匹配 "\""\(" 则匹配 "("
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配'\n''\r' 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配'\n''\r' 之前的位置。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"* 等价于{0,}
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"+ 等价于 {1,}
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do""does"? 等价于{0,1}
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个o
{n,} n 是一个非负整数。至少匹配n 次
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,’o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。
. 匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像”(.|\n)“的模式。
(pattern) 匹配 pattern 并获取这一匹配。要匹配圆括号字符,请使用 ‘(‘ 或 ‘)‘。
x|y 匹配 x 或 y。例如,’z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。
[xyz] 字符集合。匹配所包含的任意一个字符。
[^xyz] 负值字符集合。匹配未包含的任意字符。
[a-z] 字符范围。匹配指定范围内的任意字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
\B 匹配非单词边界。’er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
\w 匹配字母、数字、下划线。等价于[A-Za-z0-9_]
\W 匹配非字母、数字、下划线。等价于 [^A-Za-z0-9_]
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,’\x41’ 匹配 “A”。’\x041’ 则等价于 ‘\x04’ & “1”。正则表达式中可以使用 ASCII 编码。
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,’(.)\1’ 匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

修饰符

标记也称为修饰符,正则表达式的标记用于指定额外的匹配策略。

标记不写在正则表达式里,标记位于表达式之外,格式如下:

/pattern/flags

下表列出了正则表达式常用的修饰符:

修饰符 含义 描述
i ignore - 不区分大小写 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。
g global - 全局匹配 查找所有的匹配项。
m multi line - 多行匹配 使边界字符 ^$ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
s 特殊字符圆点 . 中包含换行符 \n 默认情况下的圆点 . 是匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。

eg:

var str="Google runoob taobao runoob"; 
var n1=str.match(/runoob/);   // 查找第一次匹配项 ==> runoob
var n2=str.match(/runoob/g);  // 查找所有匹配项 ==> runoob,runoob
var str="runoobgoogle\ntaobao\nrunoobweibo";
var n1=str.match(/^runoob/g);   // 匹配一个 ==> runoob
var n2=str.match(/^runoob/gm);  // 多行匹配 ==> runoob,runoob
var str="google\nrunoob\ntaobao";
var n1=str.match(/google./);   // 没有使用 s,无法匹配\n
var n2=str.match(/runoob./s);  // 使用 s,匹配\n  ==> runoob

[.] ==> 只匹配 . 等价于\.

var str = "abcd t%-est@-runo.ob.com 1234";
var patt1 = /\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,6}\b/g;
最后匹配的是:t%-est@-runo.ob.com

菜鸟教程

优先级

正则表达式从左到右进行计算,并遵循优先级顺序

相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:

运算符 描述
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序)
| 替换,”或”操作 字符具有高于替换运算符的优先级,使得”m|food”匹配”m”或”food”。若要匹配”mood”或”food”,请使用括号创建子表达式,从而产生”(m|f)ood”。

匹配规则

基本模式匹配

辨析一下:once^onceonce$^once$

once:匹配包含once字符串的字符串

^once:匹配以once字符串开头的字符串

once$:匹配以once字符串结尾的字符串

^once$:匹配once字符串

正则表达式中 [] 和 () 的区别

圆括号 () 是组,主要应用在限制多选结构的范围/分组/捕获文本/环视/特殊模式处理。

示例:

  • **(abc|bcd|cde)**:表示这一段是abc、bcd、cde三者之一均可,顺序也必须一致。
  • **(abc)?**:表示这一组要么一起出现,要么不出现,出现则按此组内的顺序出现。
  • **(?:abc)**:表示找到这样abc这样一组,但不记录,不保存到$变量中,否则可以通过$x取第几个括号所匹配到的项,比如:(aaa)(bbb)(ccc)(?:ddd)(eee),可以用 $1 获取 (aaa) 匹配到的内容,而 $3 则获取到了 (ccc) 匹配到的内容,而 $4 则获取的是由 (eee) 匹配到的内容,因为前一对括号没有保存变量。
  • **a(?=bbb)**:顺序环视 表示 a 后面必须紧跟 3 个连续的 b。
  • **(?i:xxxx)*:不区分大小写 (?s:.) 跨行匹配.可以匹配回车符。

方括号 [] 是单个匹配,字符集/排除字符集/命名字符集。

示例:

  • **[0-3]**:表示找到这一个位置上的字符只能是 0 到 3 这四个数字,与 (abc|bcd|cde) 的作用比较类似,但圆括号可以匹配多个连续的字符,而一对方括号只能匹配单个字符。
  • [^0-3]**:表示找到这一个位置上的字符只能是除了 0 到 3 之外的所有字符。

() 和 [] 有本质的区别

() 内的内容表示的是一个子表达式,() 本身不匹配任何东西,也不限制匹配任何东西,只是把括号内的内容作为同一个表达式来处理,例如 (ab){1,3},就表示 ab 一起连续出现最少 1 次,最多 3 次。如果没有括号的话,ab{1,3} 就表示 a,后面紧跟的 b 出现最少 1 次,最多 3 次。另外,括号在匹配模式中也很重要。这个就不延伸了,有兴趣可以自己查查。

[] 表示匹配的字符在 [] 中,并且只能出现一次,并且特殊字符写在 [] 会被当成普通字符来匹配。例如 [(a)],会匹配 (、a、)、这三个字符。

所以 ()、[] 无论是作用还是表示的含义,都有天壤之别。

(非)贪婪匹配

  • .*

. 表示匹配除换行符之外的任何单字符,*表示匹配零次或多次。所以.*表示任意字符出现零次或多次,没有?表示贪婪模式。

比如a.*b它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索 aabab 的话,它会匹配整个字符串 aabab 而不会匹配ab,aab等等。这被称为贪婪匹配。

又比如模式src='.*', 它将会以 src=' 开始,以'结束的最长的字符串

  • .*?

?跟在*或者+后边用时,表示懒惰模式。也称非贪婪模式。就是匹配尽可能少的字符。就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。

a.*?b匹配最短的,以 a 开始,以 b 结束的字符串。如果把它应用于aabab的话,它会匹配aab和ab。

eg:正则表达式 a.*?xxx 可以匹配 abxxxaxxxxxabbbbbxxx

var str = "abc123<img src=\"test.png\">def";
var patt = /<img.*?src="(.*?)".*?\/?>/gi;
==> 匹配到的字符串为:<img src="test.png">
  • .+?

同上,?*或者+后边用时,表示懒惰模式。也称非贪婪模式。就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。

a.+?b匹配最短的,以 a 开始,以 b 结束的字符串,但a和b中间至少要有一个字符。如果把它应用于ababccaab的话,它会匹配abab和aab。注意此时匹配结果不是ab,ab和aab。因为a和b中间至少要有一个字符。


文章作者: XiaozaYa
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 XiaozaYa !
  目录