正则-通关手册

350 阅读4分钟

元字符

\ : 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符

  • '\n' 匹配一个换行符,
  • '\' 匹配一个\
  • '.' 匹配一个.

^ : 匹配输入字符串的开始位置,比如^[0-9],表示匹配以数字开头的字符

$ : 匹配输入字符串的结束位置,比如[0-9]$,表示匹配以数字结尾的字符,注意[0-9]+$,匹配从末尾起的所有数字,比如'fewa12',[0-9]$会匹配到2,而[0-9]+$会匹配12

* : 表示匹配前面的表达式0到n次,等价于{0,}

+ : 表示匹配前面的表达式1到n次,等价于{1,}

? : 匹配前面的子表达式零次或一次,例如c(ab)?,可以匹配c、cab,当?紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串,例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'

{n} : n 是一个非负整数。匹配确定的 n 次

{n,} : n 是一个非负整数。至少匹配n 次。

{n,m} : m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次

. : 匹配除换行符(\n、\r)之外的任何单个字符

(pattern) : 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,str.match(reg)

(?:pattern) : 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用,例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。好像没有什么卵用

(?=pattern) : 正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。是一个非获取匹配,也就是说,该匹配不需要获取供以后使用

(?!pattern) : 正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。

(?<=pattern) : 反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。例如,"(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"。

(?<!pattern) : 反向否定预查,与正向否定预查类似,只是方向相反。例如"(?<!95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。

x|y : 匹配x或y,例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

[xyz] : 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。

[^xyz] : 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n'。

[a-z] : 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。

[^a-z] : 负值字符范围。匹配任何不在指定范围内的任意字符。例如,[^abc]能匹配jewabc的j、e、w

\b : 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er','\b'其实是匹配不了东西的

\B : 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'

\cx : 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。

\d : 匹配一个数字字符。等价于 [0-9]。

\D : 匹配一个非数字字符。等价于 [^0-9]。

\f : 匹配一个换页符。等价于 \x0c 和 \cL。

\n : 匹配一个换行符。等价于 \x0a 和 \cJ。

\r : 匹配一个回车符。等价于 \x0d 和 \cM。

\s : 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。

\S : 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

\t : 匹配一个制表符。等价于 \x09 和 \cI。

\v : 匹配一个垂直制表符。等价于 \x0b 和 \cK。

\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 匹配版权符号 (?)。

运算符优先级

\ : 转义符

(), (?:), (?=), [] : 圆括号和方括号

*, +, ?, {n}, {n,}, {n,m} : 限定符

^, $, \任何元字符、任何字符 : 定位点和序列(即:位置和顺序)

| : 替换,"或"操作,字符具有高于替换运算符的优先级

匹配规则

^once$ : 精确匹配

[^a-z] : ^表示排除匹配

.{2} : 任意两个除了'\n'之外的字符

^\- : 匹配以-开头的字符串,等于^[-],用中括号就不需要用\转义了

正则相关的API

stringObject.replace(regexp/substr,replacement)

return一个匹配后的字符串,且不改变原来变量的值。如果正则不带g,那么只匹配一次,i表示忽略大小写,replacement 中的 $ 字符具有特定的含义。如下表所示,它说明从模式匹配得到的字符串将用于替换。ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为匹配模式字符串的替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身

$&匹配到所有子串的和

RegExpObject.test(string)

如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回 false。

RegExpObject.exec(string)

返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。

当 RegExpObject 是一个全局正则表达式时,它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。

stringObject.match(searchvalue)

stringObject.match(regexp)

存放匹配结果的数组。该数组的内容依赖于 regexp 是否具有全局标志 g。如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。
如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是 stringObject 中所有的匹配子串,而且也没有 index 属性或 input 属性

new RegExp(pattern, attributes);

其中pattern是一个字符串,比如'^[0-9]+'
参数 attributes 是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。new RegExp 可以大幅度提升程序的性能

RegExpObject.compile(regexp,modifier)
compile() 方法用于在脚本执行过程中编译正则表达式。 compile() 方法也可用于改变和重新编译正则表达式。

stringObject.search(regexp)

search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。search() 方法不执行全局匹配,它将忽略标志 g。它同时忽略 regexp 的 lastIndex 属性,并且总是从字符串的开始进行检索,这意味着它总是返回 stringObject 的第一个匹配的位置

stringObject.split(separator,howmany)

String.split() 执行的操作与 Array.join 执行的操作是相反的