JavaScript 正则表达式对象RegExp的常用字符匹配规则

 2016年01月04日    812     声明


RegExp是JavaScript的正则表达式对象,它是对字符串执行模式匹配的强大工具。要正确的使用RegExp匹配字符串,需要对正式表达式有一定的了解,本文将介绍一些RegExp对象使用的正则表达式字符匹配规则。


1. 字符匹配

字符,是指在正则表达式中拥有特殊含义的字符

字符 含义
.

(点号,小数点)匹配任意单个字符,回车和换行符除外,包括:\n \r \u2028\u2029

注意:m 多行(multiline)标志并不会影响点号的表现。因此为了匹配多行中的字符集,可使用[^] ,它仍会匹配任意字符。

例如,/.y/ 匹配 "yes make my day" 中的 "my" 和 "ay",但是不匹配 "yes"。

\d

匹配基本拉丁字母表中的一个数字字符。等价于[0-9]

例如,/\d//[0-9]/ 匹配 "B2 is the suite number." 中的 '2'。

\D

匹配任意一个不是基本拉丁字母表中数字的字符。等价于[^0-9]

例如,/\D//[^0-9]/ 匹配 "B2 is the suite number." 中的 'B'。

\w

匹配任意基本拉丁字母表中的数字、字母、下划线。等价于 [A-Za-z0-9_]

例如,/\w/ 匹配 "apple" 中的 'a',"$5.28" 中的 '5' 和 "3D" 中的 '3'。

\W

匹配任意基本拉丁字母表中的,非字母、数字、下划线字符。等价于 [^A-Za-z0-9_]

例如,/\W//[^A-Za-z0-9_]/ 匹配 "50%" 中的 '%'。

\s

匹配一个空白字符,包括:空格、制表符、换页符、换行符和其他 Unicode 空格。

等价于:[ \f\n\r\t\v\u00a0\u1680\u180e \u2000\u2001\u2002\u2003\u2004 \u2005\u2006\u2007\u2008\u2009\u200a \u2028\u2029\u202f\u205f \u3000]。

例如: /\s\w*/ 匹配 "foo bar" 中的 ' bar'。

\S

匹配一个非空白字符。

等价于:[^ \f\n\r\t\v\u00a0\u1680\u180e \u2000\u2001\u2002\u2003\u2004 \u2005\u2006\u2007\u2008\u2009 \u200a\u2028\u2029\u202f\u205f\u3000]。

例如,/\S\w*/ 匹配 "foo bar" 中的 'foo'。

\t 匹配一个水平制表符(tab)
\r 匹配一个回车符(carriage return)
\n 匹配一个换行符(linefeed)
\v 匹配一个垂直制表符(vertical tab)
\f 匹配一个换页符(form-feed)
[\b] 匹配一个退格符(backspace)(不要与 \b 混淆)
\0 匹配一个 NULL 字符。不要在此后面跟小数点。
\cX

X 是 A-Z 的一个字母。匹配字符串中的一个控制字符。

例如,/\cM/ 匹配字符串中的 control-M。

\xhh 匹配编码为 hh (两个十六进制数字)的字符。
\uhhhh 匹配 Unicode 值为 hhhh (四个十六进制数字)的字符。
\

转义字符

对于那些被认为有字面意义的字符来说,表示下一个字符具有特殊用处,并且不会被按照字面意义解释。

例如: /b/ 匹配字符 'b'。在 b 前面加上一个反斜杠,即使用 /\b/,则该字符变得特殊,以为这匹配一个单词边界。

对于那些通常特殊对待的字符,表示下一个字符不具有特殊用途,会被按照字面意义解释。

例如:* 是一个特殊字符,表示匹配某个字符 0 或多次,如 /a*/ 意味着 0 或多个 "a"。 为了匹配字面意义上的 * ,在它前面加上一个反斜杠,例如,/a\*/匹配 'a*'。


2. 字符集合

字符集合也叫做字符组,字符集合用方括号表示,用于查找某个范围内的字符

字符 含义
[xyz]

匹配集合中的任意一个字符。你可以使用连字符'-'指定一个范围。

例如:[abcd] 等价于 [a-d],匹配"brisket"中的'b'和"chop"中的'c'。

[^xyz]

它匹配任意不在括号内的字符。你也可以通过使用连字符'-'指定一个范围内的字符。

例如,[^abc] 等价于 [^a-c]。 第一个匹配的是 "bacon" 中的'o' 和 "chop" 中的 'h'。

[0-9] 查找任何从 0 至 9 的数字,等价于 \d。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符。
[adgk] 查找指定集合内的任何字符。
[^adgk] 查找不在指定集合内的任何字符。


3. 分组与反向引用

分组用小括号表示,用户整体匹配小括号内的字符。反向引用,是指从指定位置开始向前匹配指定分组出现的次数。

字符 含义
(x)

匹配 x 并且捕获匹配项,组捕获查询性能会降低。

例如,/(foo)/ 匹配且捕获 "foo bar." 中的 "foo"。被匹配的子字符串可以在结果数组的元素 [1], ..., [n] 中找到,或在被定义的 RegExp 对象的属性 $1, ..., $9 中找到。

(?:x) 匹配 x ,但不会捕获匹配项。匹配项不能够从结果数组的元素 [1], ..., [n] 或已被定义的 RegExp 对象的属性 $1, ..., $9 再次访问到。
\n

反向引用,指向从正则表达式分组内容(括号中内容)在左侧出现的次数。n 是一个正整数。

例如,/apple(,)\sorange\1/ 匹配 "apple, orange, cherry, peach." 中的 "apple,orange,"。

(red|blue|green) 查找指定选项中任意一项。


4. 边界

边界有两种:一种表示开始匹配和结束配置的位置,一种是表示单词边界

字符 含义
^

开始匹配的位置,即: 匹配输入/字符串的开始。如果多行标志m被设为 true,该字符也会匹配一个换行符后的开始位置。

例如:/^A/ 不匹配 "an A" 中的 "A",但匹配 "An A" 中的 "A"。

$

结束匹配的位置,即: 匹配输入/字符串的结尾。如果多行标志m被设为 true,该字符也会匹配一个换行符的前的结尾位置。

例如:/t$/ 不匹配 "eater" 中的 "t",但匹配 "eat" 中的 "t"。

\b

匹配一个零宽单词边界。如,一个字母与一个空格之间。 (不要和 [\b] 混淆)

例如:/\bno/ 匹配 "at noon" 中的 "no",/ly\b/ 匹配 "possibly yesterday." 中的 "ly"。

\B

匹配一个零宽非单词边界。如,两个字母之间或两个空格之间。

例如:/\Bon/ 匹配 "at noon" 中的 "on",/ye\B/ 匹配 "possibly yesterday." 中的 "ye"。


5. 数量

数量,是指进行正则表达式匹配时所能匹配到的次数

字符 含义
x*

匹配前面的匹配项 x 0 或多次。

例如:/bo*/ 匹配 "A ghost booooed" 中的 "boooo","A bird warbled" 中的 "b",但是不匹配 "A goat grunted"。

x+

匹配前面的匹配项 x 1 或多次。等价于 {1,}

例如:/a+/ 匹配 "candy" 中的 "a","caaaaaaandy" 中所有的 "a"。

x*?
x+?

与上面的 * 和 + 一样匹配前面的的匹配项 x,但表示最小可能匹配次数。

例如:/".*?"/ 匹配 '"foo" "bar"' 中的 '"foo"',而 * 后面没有 ? 时匹配 '"foo" "bar"'。

x?

匹配前面的匹配项 x 0 或 1 次。

例如:/e?le?/ 匹配 "angel" 中的 "el","angle" 中的 "le"。

默认情况下,正则匹配是贪婪的,即:匹配最大可匹配次数。在任何数量词 *+?{},任意一项其后增加符号(?),会使数量词变为非贪婪的,即:匹配最小可匹配次数。

x(?=y)

匹配 x,但只有当 x 后面紧跟着 y 时,才匹配 x

例如:/it(?=bilu)/会匹配'itbilu.com'中的'it',但匹配模式中的'bilu'并不是匹配结果中的一部分。

x(?!y)

匹配x,但只有当 x 后面不是紧跟着 y 时,才匹配 x

例如:/\d+(?!\.)/.exec("3.141") 匹配 141 而不是 3.141。

x|y

匹配 xy

例如:/green|red/ "green apple" 会匹配 ‘green',"red apple." 中的 'red'。

x{n}

n 是一个正整数,表示匹配前面匹配项x 连续出现的次数。

例如:/a{2}/ 不匹配 "candy," 中的 "a",但是匹配 "caandy," 中的两个 "a",且匹配 "caaandy." 中的前两个 "a"。

x{n,}

n 是一个正整数。表示匹配前面匹配项x 连续出现至少 n 次。

例如:/a{2,}/ 不匹配 "candy" 中的 "a",但是匹配 "caandy" 和 "caaaaaaandy." 中所有的 "a"。

x{n,m}

表示匹配前面匹配项x出现至少 n 次,至多 m 次。nm 为正整数。。

例如:/a{1,3}/ 不匹配 "cndy",匹配 "candy," 中的 "a","caandy," 中的两个 "a",匹配 "caaaaaaandy" 中的前面三个 "a"。注意,当匹配 "caaaaaaandy" 时,即使原始字符串拥有更多的"a",匹配项也是 "aaa"。