正则表达式语法速查表

本页通过聚合 RegExp 指南中的文章内容,提供了 RegExp 语法所有功能的速查表。如果您需要有关特定主题的更多信息,请点击相应标题上的链接以访问完整文章,或前往指南

字符类

字符类用于区分不同类型的字符,例如区分字母和数字。

字符 含义
[xyz]
[a-c]

字符类: 匹配方括号中包含的任何一个字符。您可以使用连字符指定字符范围,但如果连字符出现在方括号内作为第一个或最后一个字符,则它将被视为一个字面连字符,并作为普通字符包含在字符类中。

例如,[abcd][a-d] 相同。它们匹配 "brisket" 中的 "b" 和 "chop" 中的 "c"。

例如,[abcd-][-abcd] 匹配 "brisket" 中的 "b"、"chop" 中的 "c" 以及 "non-profit" 中的 "-" (连字符)。

例如,[\w-][A-Za-z0-9_-] 相同。它们都匹配 "brisket" 中的 "b"、"chop" 中的 "c" 以及 "non-profit" 中的 "n"。

[^xyz]
[^a-c]

反向字符类: 匹配方括号中未包含的任何字符。您可以使用连字符指定字符范围,但如果连字符出现在 ^ 之后的第一个字符或方括号内最后一个字符,则它将被视为一个字面连字符,并作为普通字符包含在字符类中。例如,[^abc][^a-c] 相同。它们最初匹配 "bacon" 中的 "o" 和 "chop" 中的 "h"。

注意: ^ 字符也可以表示输入的开头

.

通配符: 匹配任何单个字符,除了行终止符:\n\r\u2028\u2029。例如,/.y/ 匹配 "yes make my day" 中的 "my" 和 "ay",但不匹配 "yes" 中的 "yes",因为 "yes" 中 "y" 前面没有字符。如果启用了 dotAll (s) 标志,则也匹配行终止符。在字符类内部,点号失去其特殊含义,匹配一个字面点号。

\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" 和 "Émanuel" 中的 "m"。

\W

非单词字符类转义: 匹配基本拉丁字母中非单词字符的任何字符。等同于 [^A-Za-z0-9_]。例如,/\W//[^A-Za-z0-9_]/ 匹配 "50%" 中的 "%" 和 "Émanuel" 中的 "É"。

\s

空白字符类转义: 匹配单个空白字符,包括空格、制表符、换页符、换行符和其他 Unicode 空格。等同于 [\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。例如,/\s\w*/ 匹配 "foo bar" 中的 " bar"。

\S

非空白字符类转义: 匹配单个非空白字符。等同于 [^\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。例如,/\S\w*/ 匹配 "foo bar" 中的 "foo"。

\t 匹配水平制表符。
\r 匹配回车符。
\n 匹配换行符。
\v 匹配垂直制表符。
\f 匹配换页符。
[\b] 匹配退格符。如果您要查找单词边界断言 (\b),请参阅断言
\0 匹配 NUL 字符。其后不能跟其他数字。
\cX

使用脱字号表示法匹配控制字符,其中 "X" 是 A-Z 的字母(对应于代码点 U+0001U+001A)。例如,/\cM\cJ/ 匹配 "\r\n"。

\xhh 匹配代码为 hh(两个十六进制数字)的字符。
\uhhhh 匹配值为 hhhh(四个十六进制数字)的 UTF-16 代码单元。
\u{hhhh}\u{hhhhh} (仅当设置了 u 标志时)匹配 Unicode 值为 U+hhhhU+hhhhh(十六进制数字)的字符。
\p{UnicodeProperty}, \P{UnicodeProperty}

Unicode 字符类转义: 根据其 Unicode 字符属性匹配字符(例如,表情符号字符、日文片假名字符或中文/日文汉字等)。

\

表示应特殊对待或“转义”后续字符。它有两种行为方式。

  • 对于通常被视为字面字符的字符,表示下一个字符是特殊的,不应按字面解释。例如,/b/ 匹配字符 "b"。通过在 "b" 前面放置反斜杠,即使用 /\b/,该字符变得特殊,表示匹配单词边界。
  • 对于通常被特殊对待的字符,表示下一个字符不是特殊的,应按字面解释。例如,"*" 是一个特殊字符,表示匹配前一个字符出现 0 次或更多次;例如,/a*/ 表示匹配 0 个或更多个 "a"。要字面匹配 *,请在其前面加上反斜杠;例如,/a\*/ 匹配 "a*"。

注意: 要字面匹配此字符,请用自身转义它。换句话说,要搜索 \,请使用 /\\/

x|y

逻辑或: 匹配 "x" 或 "y"。每个由竖线 (|) 分隔的组成部分称为一个替代项。例如,/green|red/ 匹配 "green apple" 中的 "green" 和 "red apple" 中的 "red"。

注意: 逻辑或是一种指定“一组选择”的另一种方式,但它不是一个字符类。逻辑或不是原子——您需要使用一个分组来使其成为更大模式的一部分。[abc] 在功能上等同于 (?:a|b|c)

断言

断言包括边界(指示行和单词的开头和结尾)以及以某种方式指示匹配可能性的其他模式(包括先行断言、后行断言和条件表达式)。

边界类型断言

字符 含义
^

输入边界起始断言: 匹配输入的开头。如果启用了 multiline (m) 标志,则也匹配换行符之后的位置。例如,/^A/ 不匹配 "an A" 中的 "A",但匹配 "An A" 中的第一个 "A"。

注意: 当此字符出现在字符类的开头时,它具有不同的含义。

$

输入边界结束断言: 匹配输入的结尾。如果启用了 multiline (m) 标志,则也匹配换行符之前的位置。例如,/t$/ 不匹配 "eater" 中的 "t",但匹配 "eat" 中的 "t"。

\b

单词边界断言: 匹配一个单词边界。这是单词字符不紧接或不紧跟另一个单词字符的位置,例如在字母和空格之间。请注意,匹配的单词边界不包含在匹配结果中。换句话说,匹配的单词边界的长度为零。

示例

  • /\bm/ 匹配 "moon" 中的 "m"。
  • /oo\b/ 不匹配 "moon" 中的 "oo",因为 "oo" 后面跟着 "n",而 "n" 是一个单词字符。
  • /oon\b/ 匹配 "moon" 中的 "oon",因为 "oon" 是字符串的结尾,因此后面没有单词字符。
  • /\w\b\w/ 永远不会匹配任何内容,因为一个单词字符永远不会同时紧跟一个非单词字符和一个单词字符。

要匹配退格符 ([\b]),请参阅字符类

\B

非单词边界断言: 匹配非单词边界。这是前一个字符和后一个字符类型相同的位置:两者都必须是单词字符,或者两者都必须是非单词字符,例如在两个字母之间或两个空格之间。字符串的开头和结尾被视为非单词。与匹配的单词边界一样,匹配的非单词边界也不包含在匹配结果中。例如,/\Bon/ 匹配 "at noon" 中的 "on",而 /ye\B/ 匹配 "possibly yesterday" 中的 "ye"。

其他断言

注意: ? 字符也可以用作量词。

字符 含义
x(?=y)

先行断言: 仅当 "x" 后面跟着 "y" 时才匹配 "x"。例如,/Jack(?=Sprat)/ 仅当 "Jack" 后面跟着 "Sprat" 时才匹配 "Jack"。
/Jack(?=Sprat|Frost)/ 仅当 "Jack" 后面跟着 "Sprat" 或 "Frost" 时才匹配 "Jack"。但是,"Sprat" 和 "Frost" 都不属于匹配结果。

x(?!y)

负向先行断言: 仅当 "x" 后面没有跟着 "y" 时才匹配 "x"。例如,/\d+(?!\.)/ 仅当数字后面没有小数点时才匹配数字。/\d+(?!\.)/.exec('3.141') 匹配 "141" 而不是 "3"。

(?<=y)x

后行断言: 仅当 "x" 前面是 "y" 时才匹配 "x"。例如,/(?<=Jack)Sprat/ 仅当 "Sprat" 前面是 "Jack" 时才匹配 "Sprat"。/(?<=Jack|Tom)Sprat/ 仅当 "Sprat" 前面是 "Jack" 或 "Tom" 时才匹配 "Sprat"。但是,"Jack" 和 "Tom" 都不属于匹配结果。

(?<!y)x

负向后行断言: 仅当 "x" 前面不是 "y" 时才匹配 "x"。例如,/(?<!-)\d+/ 仅当数字前面没有减号时才匹配数字。/(?<!-)\d+/.exec('3') 匹配 "3"。/(?<!-)\d+/.exec('-3') 未找到匹配项,因为数字前面有减号。

分组和反向引用

分组和反向引用表示表达式字符组。

字符 含义
(x)

捕获组: 匹配 x 并记住匹配项。例如,/(foo)/ 匹配并记住 "foo bar" 中的 "foo"。

一个正则表达式可以有多个捕获组。在结果中,捕获组的匹配项通常在一个数组中,其成员的顺序与捕获组中左括号的顺序相同。这通常就是捕获组本身的顺序。当捕获组嵌套时,这一点变得很重要。通过结果元素的索引 ([1], …, [n]) 或预定义 RegExp 对象的属性 ($1, …, $9) 来访问匹配项。

捕获组会带来性能损失。如果您不需要回调匹配的子字符串,请优先使用非捕获括号(见下文)。

如果设置了 /.../g 标志,String.prototype.match() 将不返回分组。但是,您仍然可以使用 String.prototype.matchAll() 来获取所有匹配项。

(?<Name>x)

命名捕获组: 匹配 "x" 并将其存储在返回匹配项的 groups 属性中,名称由 <Name> 指定。组名需要尖括号(<>)。

例如,要从电话号码中提取美国区号,我们可以使用 /\((?<area>\d\d\d)\)/。结果数字将出现在 matches.groups.area 下。

(?:x)

非捕获组: 匹配 "x" 但不记住匹配项。匹配的子字符串无法从结果数组的元素 ([1], …, [n]) 或预定义 RegExp 对象的属性 ($1, …, $9) 中回调。

(?flags:x), (?:flags-flags:x)

修饰符: 仅对封闭模式启用或禁用指定标志。修饰符中只能使用 ims 标志。

\n

反向引用: 其中 "n" 是一个正整数。匹配正则表达式中第 n 个捕获组(从左括号开始计数)匹配的相同子字符串。例如,/apple(,)\sorange\1/ 匹配 "apple, orange, cherry, peach" 中的 "apple, orange,"。

\k<Name>

命名反向引用: 对由 <Name> 指定的命名捕获组最后匹配的子字符串的反向引用。

例如,/(?<title>\w+), yes \k<title>/ 匹配 "Do you copy? Sir, yes Sir!" 中的 "Sir, yes Sir"。

注意: \k 在此字面表示命名捕获组的反向引用的开头。

量词

量词表示要匹配的字符或表达式的数量。

注意: 在下文中,不仅指单个字符,还包括字符类以及分组和反向引用

字符 含义
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" 0 次或 1 次。例如,/e?le?/ 匹配 "angel" 中的 "el" 和 "angle" 中的 "le"。

如果紧跟在 *+?{} 任何一个量词之后使用,则使量词非贪婪(匹配最少次数),与默认的贪婪(匹配最多次数)相反。

x{n}

其中 "n" 是一个非负整数,精确匹配前面的项 "x" 出现 "n" 次。例如,/a{2}/ 不匹配 "candy" 中的 "a",但匹配 "caandy" 中的所有 "a",以及 "caaandy" 中的前两个 "a"。

x{n,}

其中 "n" 是一个非负整数,匹配前面的项 "x" 至少出现 "n" 次。例如,/a{2,}/ 不匹配 "candy" 中的 "a",但匹配 "caandy" 和 "caaaaaaandy" 中的所有 "a"。

x{n,m}

其中 "n" 和 "m" 是非负整数,且 m >= n,匹配前面的项 "x" 至少出现 "n" 次,最多出现 "m" 次。例如,/a{1,3}/ 在 "cndy" 中不匹配任何内容,匹配 "candy" 中的 "a","caandy" 中的两个 "a",以及 "caaaaaaandy" 中的前三个 "a"。请注意,当匹配 "caaaaaaandy" 时,匹配结果是 "aaa",尽管原始字符串中包含更多的 "a"。

x*?
x+?
x??
x{n}?
x{n,}?
x{n,m}?

默认情况下,像 *+ 这样的量词是“贪婪的”,这意味着它们会尝试匹配尽可能多的字符串。量词后面的 ? 字符使量词“非贪婪”:这意味着它会在找到匹配项后立即停止。例如,给定一个像 "some <foo> <bar> new </bar> </foo> thing" 的字符串

  • /<.*>/ 将匹配 "<foo> <bar> new </bar> </foo>"
  • /<.*?>/ 将匹配 "<foo>"