正则表达式语法速查表

此页面通过汇总 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/ 匹配 "my" 和 "ay",但不匹配 "yes",在 "yes make my day" 中,因为 "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) 访问匹配结果。

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

String.prototype.match() 如果设置了 /.../g 标志,则不会返回组。但是,您仍然可以使用 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," in "apple, orange, cherry, peach"。

\k<Name>

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

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

注意: \k 在这里被用作字面意思,表示对命名捕获组的反向引用的开头。

量词

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

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

字符 含义
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>"