1、JavaScript中的正则表达式字符 描述 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。例如,n匹配字符“n“。n匹配一个换行符。序列匹配“而“(“则匹配“(“。 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,也匹配n或r之后的位置。$ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配n或r之前的位置。* 匹配前面的子表达式零次或多次。例如,zo*能匹配“z“以及“zoo“。*等价于0,。+ 匹配前面的子表达式一次或多次。例如,zo+能匹配“zo“以及“zoo“,但不能匹配“z“。+
2、等价于1,。? 匹配前面的子表达式零次或一次。例如,“do(es)?“可以匹配“do“或“does“中的“do“。?等价于0,1。n n是一个非负整数。匹配确定的n次。例如,o2不能匹配“Bob“中的o,但是能匹配“food“中的两个o。n, n是一个非负整数。至少匹配n次。例如,o2,不能匹配“Bob“中的o,但能匹配“foooood“中的所有o。o1,等价于o+。o0,则等价于o*。n,m m和n均为非负整数,其中n ) 组匹配的最后一个子字符串。$ 替换单个“$”字符。$& 替换完全匹配本身的一个副本。$ 替换匹配前的输入字符串的所有文本。$ 替换匹配后的输入字符串的所有文本。$+ 替换
3、最后捕获的组。$_ 替换整个输入字符串。字符类是一个字符集,如果字符集中的任何一个字符有匹配,它就会找到该匹配项。下表总结了字符匹配语法。字符类 说明. 与除 n 之外的任何字符匹配。如果已用 Singleline 选项做过修改,则句点字符将与任何字符匹配。有关详细信息,请参见正则表达式选项。aeiou 与指定字符集中包含的任何单个字符匹配。aeiou 与不在指定字符集中的任何单个字符匹配。0-9a-fA-F 使用连字号 () 允许指定连续字符范围。pname 与 name 指定的命名字符类中的任何字符匹配。支持的名称为 Unicode 组和块范围。例如,Ll、Nd、Z、IsGreek、IsB
4、oxDrawing。Pname 与在 name 中指定的组和块范围中未包含的文本匹配。w 与任何单词字符匹配。等效于 Unicode 字符类别 pLlpLupLtpLopNdpPc。如果用 ECMAScript 选项指定了符合 ECMAScript 的行为,则 w 等效于 a-zA-Z_0-9。W 与任何非单词字符匹配。等效于 Unicode 类别 pLlpLupLtpLopNdpPc。如果用 ECMAScript 选项指定了符合 ECMAScript 的行为,则 W 等效于 a-zA-Z_0-9。s 与任何空白字符匹配。等效于 Unicode 字符类别 fnrtvx85pZ。如果用 ECMA
5、Script 选项指定了符合 ECMAScript 的行为,则 s 等效于 fnrtv。S 与任何非空白字符匹配。等效于 Unicode 字符类别 fnrtvx85pZ。如果用 ECMAScript 选项指定了符合 ECMAScript 的行为,则 S 等效于 fnrtv。d 与任何十进制数字匹配。等效于 pNd(对于 Unicode 类别)和 0-9(对于非 Unicode 类别)ECMAScript 行为。D 与任何非数字匹配。等效于 PNd(对于 Unicode 类别)和 0-9(对于非 Unicode 类别)ECMAScript 行为。原子零宽度断言下表中描述的元字符不会使引擎在字符串
6、中前进或使用字符。它们只是根据字符串中的当前位置使匹配成功或失败。断言 说明 指定匹配必须出现在字符串的开头或行的开头。有关详细信息,请参见正则表达式选项中的 Multiline 选项。$ 指定匹配必须出现在以下位置:字符串结尾、字符串结尾的 n 之前或行的结尾。有关详细信息,请参见正则表达式选项中的 Multiline 选项。A 指定匹配必须出现在字符串的开头(忽略 Multiline 选项)。Z 指定匹配必须出现在字符串的结尾或字符串结尾的 n 之前(忽略 Multiline 选项)。z 指定匹配必须出现在字符串的结尾(忽略 Multiline 选项)。G 指定匹配必须出现在上一个匹配结束
7、的地方。与 Match.NextMatch() 一起使用时,此断言确保所有匹配都是连续的。b 指定匹配必须出现在 w(字母数字)和 W(非字母数字)字符之间的边界上。匹配必须出现在单词边界上,即出现在由任何非字母数字字符分隔的单词中第一个或最后一个字符上。B 指定匹配不得出现在 b 边界上。下表描述了影响匹配数量的元字符。限定符 说明* 指定零个或更多个匹配;例如 w* 或 (abc)*。等效于 0,。+ 指定一个或多个匹配;例如 w+ 或 (abc)+。等效于 1,。? 指定零个或一个匹配;例如 w? 或 (abc)?。等效于 0,1。n 指定恰好 n 个匹配;例如 (pizza)2。n,
8、指定至少 n 个匹配;例如 (abc)2,。n,m 指定至少 n 个但不多于 m 个匹配。*? 指定尽可能少地使用重复的第一个匹配(等效于 lazy *)。+? 指定尽可能少地使用重复但至少使用一次(等效于 lazy +)。? 指定使用零次重复(如有可能)或一次重复 (lazy ?)。n? 等效于 n (lazy n)。n,? 指定尽可能少地使用重复但至少使用 n 次 (lazy n,)。n,m? 指定介于 n 次和 m 次之间、尽可能少地使用重复 (lazy n,m)。分组构造使您可以捕获子表达式组并提高具有非捕获预测先行和回顾后发修饰符的正则表达式的效率。下表描述了正则表达式分组构造。分组
9、构造 说明( ) 捕获匹配的子字符串(或非捕获组;有关详细信息,请参见正则表达式选项中的 ExplicitCapture 选项)。使用 () 的捕获根据左括号的顺序从 1 开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本。(? ) 将匹配的子字符串捕获到一个组名称或编号名称中。用于 name 的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如 (?name)。(? ) 平衡组定义。删除先前定义的 name2 组的定义并在 name1 组中存储先前定义的 name2 组和当前组之间的间隔。如果未定义 name2 组,则匹配将回溯。由于删除
10、name2 的最后一个定义会显示 name2 的先前定义,因此该构造允许将 name2 组的捕获堆栈用作计数器以跟踪嵌套构造(如括号)。在此构造中, name1 是可选的。可以使用单引号替代尖括号,例如 (?name1-name2)。(?: ) 非捕获组。(?imnsx-imnsx: ) 应用或禁用子表达式中指定的选项。例如,(?i-s: ) 将打开不区分大小写并禁用单行模式。有关详细信息,请参见正则表达式选项。(?= ) 零宽度正预测先行断言。仅当子表达式在此位置的右侧匹配时才继续匹配。例如,w+(?=d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。(?! ) 零宽度负预测先行
11、断言。仅当子表达式不在此位置的右侧匹配时才继续匹配。例如,b(?!un)w+b 与不以 un 开头的单词匹配。(? ) 非回溯子表达式(也称为“贪婪”子表达式)。该子表达式仅完全匹配一次,然后就不会逐段参与回溯了。(也就是说,该子表达式仅与可由该子表达式单独匹配的字符串匹配。)命名捕获根据左括号的从左到右的顺序按顺序编号(与非命名捕获类似),但在对所有非命名捕获进行计数之后才开始对命名捕获进行编号。例如,模式 (?abc)/d+)?(?xyz)(.*) 按编号和名称产生下列捕获组。(编号为 0 的第一个捕获总是指整个模式)。编号 名称 模式0 0(默认名称) (?abc)/d+)?(?xyz)
12、(.*)1 1(默认名称) (?abc)/d+)2 2(默认名称) (.*)3 1 (?abc)4 2 (?xyz)下表列出了用于将后向引用修饰符添加到正则表达式中的可选参数。后向引用构造 定义number 后向引用。例如,(w)1 查找双写的单词字符。k 命名后向引用。例如,(?w)k 查找双写的单词字符。表达式 (?w)43 执行同样的操作。可以使用单引号替代尖括号,例如 kchar。下表列出了用于修改正则表达式以允许进行二者之一/或匹配的特殊字符。替换构造 定义| 与用 | (垂直条)字符分隔的任何一个术语匹配;例如,cat|dog|tiger。使用最左侧的成功匹配。(?(express
13、ion)yes|no) 如果表达式在此位置匹配,则与“yes”部分匹配;否则,与“no”部分匹配。“no”部分可省略。表达式可以是任何有效的子表达式,但它将变为零宽度断言,因此该语法等效于 (?(?=expression)yes|no)。请注意,如果表达式是命名组的名称或捕获组编号,则替换构造将解释为捕获测试(在本表的下一行对此进行了描述)。若要避免在这些情况下产生混淆,则可以显式拼出内部 (?= expression)。(?(name)yes|no) 如果命名捕获字符串有匹配,则与“yes”部分匹配;否则,与“no”部分匹配。“no”部分可省略。如果给定的名称不与此表达式中使用的捕获组的名称
14、或编号对应,则替换构造将解释为表达式测试(在本表的上一行进行了描述)。下表列出了用于修改正则表达式的子表达式。构造 定义(?imnsx-imnsx) 对诸如不区分大小写这样的选项进行设置或禁用以使其在模式中间打开或关闭。有关特定选项的信息,请参见正则表达式选项。在封闭组结束之前,选项更改将一直有效。请参见有关分组构造 (? imnsx-imnsx: ) 的信息,它是一个更为巧妙的形式。(?# ) 插入到正则表达式内部的内联注释。该注释在第一个右括号字符处终止。# 至行尾 X 模式注释。该注释以非转义的 # 开头,并继续到行的结尾。(请注意,必须激活 x 选项或 RegexOptions.IgnorePatternWhitespace 枚举选项才能识别此类注释。)