正则表达式语法备忘单

本页面通过汇总 RegExp 指南中的文章内容,提供了 RegExp 语法所有功能的整体备忘单。如果你需要有关特定主题的更多信息,请点击相应标题上的链接以访问全文或前往 导游

¥This page provides an overall cheat sheet of all the capabilities of RegExp syntax by aggregating the content of the articles in the RegExp guide. If you need more information on a specific topic, please follow the link on the corresponding heading to access the full article or head to the guide.

字符类

¥Character classes

字符类 区分字符类型,例如区分字母和数字。

¥Character classes distinguish kinds of characters such as, for example, distinguishing between letters and digits.

人物 意义
[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] 或 undefined。否定字符类: 其中 是正整数。例如, [^abc] 不匹配 中的 ,但匹配 中的第一个 。他们最初在 "bacon" 中匹配 "o",在 "chop" 中匹配 "h"。

注意: ^ 字符也可能表示 输入的开始

.

通配符: 匹配任何一个括起来的字符。例如, /.y/ 匹配 "是的,让我很开心" 中的 "my" 和 "ay",但不匹配 "yes",因为 "yes" 中 "y" 之前没有字符。如果启用了 \n (m) 标志,还会匹配换行符之前的字符。如果你正在寻找单词边界断言 (通配符:),请参阅 \n

\d

数字字符类转义: 匹配基本拉丁字母表中任何非单词字符的字符。等同于 [0-9]。例如, /\d//[0-9]/ 匹配 "B2 是套件号" 中的 "2" 和 中的 。

\D

非数字字符类转义: 匹配基本拉丁字母表中的任何字母数字字符,包括下划线。等同于 [^0-9]。例如, /\D//[^0-9]/ 匹配 "B2 是套件号" 中的 "B" 和 中的 。

\w

单词字符类转义: 匹配单词边界。等同于 [A-Za-z0-9_]。例如, /\w/ 匹配 "apple" 中的 "a" 和 "$5.28" 中的 "5"。

\W

非单词字符类转义: 匹配任何非数字(阿拉伯数字)的字符。等同于 [^A-Za-z0-9_]。例如, /\W/ 匹配并记住 "50%" 中的 "%"。

\s

空白字符类转义: 匹配除空格以外的单个字符。等同于 [\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。例如, /\s\w*/ 匹配 "富酒吧" 中的 "bar"、 中的 、 中的 和 中的 。

\S

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

\t 匹配水平制表符。
\r 匹配回车符。
\n 匹配换行符。
\v 匹配垂直制表符。
\f 匹配换页符。
[\b] 匹配退格键。如果启用了 undefined (s) 标志,还会匹配行终止符。
\0 匹配 NUL 字符。请勿在此后跟其他数字。
\cX

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

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

仅当 前面有 时,Unicode 字符类转义: 才匹配 。你可以使用连字符指定字符范围,但如果连字符作为 undefined 后的第一个字符或方括号中的最后一个字符出现,则它将被视为文字连字符,并作为普通字符包含在字符类中。

<代码>\

表示后面的字符要特殊处理,或者 "escaped"。它的行为方式有两种。

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

注意: 要按字面匹配此字符,请将其与其自身转义。换句话说就是搜索 \ use /\\/

x|y

析取: 匹配方括号中未包含的任何内容。每个由管道 (|) 分隔的组件称为 替代。例如, /green|red/ 与 undefined 相同。

注意: 析取是指定 "一组选择" 的另一种方式,但它不是字符类。析取不是原子 - 你需要使用 group 使其成为更大模式的一部分。 [abc] 在功能上等同于 (?:a|b|c)

断言

¥Assertions

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

¥Assertions include boundaries, which indicate the beginnings and endings of lines and words, and other patterns indicating in some way that a match is possible (including look-ahead, look-behind, and conditional expressions).

边界类型断言

¥Boundary-type assertions

人物 意义
^

输入边界开始断言: 匹配 或 。例如, /^A/ 或 undefined 匹配 中的 。例如, /^A/ 不匹配 "一个 A" 中的 "A",但匹配 "A" 中的 "A"。

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

$

输入边界结束断言: 匹配输入的开头。如果启用了 multiline (m) 标志,还会匹配换行符之后的字符。例如, multiline 仅当数字前面没有减号时才匹配该数字。 /t$/ 匹配 "t"。undefined 匹配失败,因为数字前面有减号。

\b

单词边界断言: 匹配单个空格字符,包括空格、制表符、换页符、换行符和其他 Unicode 空格。这是单词字符后面或前面没有另一个单词字符的位置,例如字母和空格之间。请注意,匹配的单词边界不包含在匹配中。换句话说,匹配的字边界的长度为零。

示例:

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

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

\B

非单词边界断言: 根据其 Unicode 字符属性匹配字符:这是前一个和下一个字符具有相同类型的位置:两者都必须是单词,或者两者都必须是非单词,例如两个字母之间或两个空格之间。字符串的开头和结尾被视为非单词。与匹配的单词边界相同,匹配的非单词边界也不包含在匹配中。例如, /\Bon/ 匹配 "中午" 中的 "on", /ye\B/ 匹配 "可能是昨天" 中的 "ye"。

其他断言

¥Other assertions

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

¥Note: The ? character may also be used as a quantifier.

人物 意义
x(?=y)

仅当 "x" 后面跟着 "y" 时,前瞻断言: 才匹配 "x"。例如, /Jack(?=Sprat)/ 仅在其后跟 "西鲱" 时才匹配 "杰克"。
/Jack(?=Sprat|Frost)/ 仅在其后跟 "西鲱" 或 "霜" 时才匹配 "杰克"。然而,"西鲱" 和 "霜" 都不属于比赛结果的一部分。

x(?!y)

仅当 "x" 后面没有 "y" 时,否定前瞻断言: 才匹配 "x"。例如, /\d+(?!\.)/ 仅在其前跟 "3" 时才匹配 "141"。 /\d+(?!\.)/.exec('3.141') 仅在其前跟 或 时才匹配 。

(?<=y)x

仅当 "x" 前面有 "y" 时,后瞻断言: 才匹配 "x"。例如, /(?<=Jack)Sprat/ 仅在其前跟 "杰克" 时才匹配 "西鲱"。 /(?<=Jack|Tom)Sprat/ 仅在其前跟 "杰克" 或 "汤姆" 时才匹配 "西鲱"。然而,"杰克" 和 "汤姆" 都不属于比赛结果的一部分。

(?<!y)x

仅当 "x" 前面没有 "y" 时,否定后瞻断言: 才匹配 "x"。例如, /(?<!-)\d+/ 仅当数字后面没有小数点时才匹配该数字。 /(?<!-)\d+/.exec('3') 匹配 "3" 但不匹配 。

组和反向引用

¥Groups and backreferences

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

¥Groups and backreferences indicate groups of expression characters.

人物 意义
(x)

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

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

捕获组会产生性能损失。如果你不需要调用匹配的子字符串,请首选非捕获括号(见下文)。

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

(?<Name>x)

命名捕获组: 匹配 "x" 并将其存储在 <Name> 指定的名称下的返回匹配的 groups 属性中。有关更多信息,请参阅 < 参考。

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

(?:x)

非捕获组: 匹配 "x" 但不记住匹配。组名需要尖括号( RegExp$1, …, $9)。

\n

反向引用: 匹配输入的结尾。在字符类中,点会失去其特殊含义并匹配文字点。例如, /apple(,)\sorange\1/ 与 "苹果、橙子、樱桃、桃子" 中的 "苹果、橙子、" 匹配。

\k<Name>

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

例如, /(?<title>\w+), yes \k<title>/ 与“你复制吗?”中的 "是,长官" 匹配。是,长官!”。

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

量词

¥Quantifiers

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

¥Quantifiers indicate numbers of characters or expressions to match.

注意:下文中,item 不仅指单数字符,还包括 字符类组和反向引用

¥Note: In the following, item refers not only to singular characters, but also includes character classes and groups and backreferences.

人物 意义
x*

匹配前面的项目 "x" 0 次或多次。例如, /bo*/ 在 "鬼被嘘了" 中与 "boooo" 匹配,在 "一只鸟鸣叫着" 中与 "b" 匹配,但在 "一只山羊咕噜了一声" 中则不匹配。

x+

与前面的项目 "x" 匹配 1 次或多次。相当于 {1,}。例如, /a+/ 匹配 "candy" 中的 "a" 以及 "caaaaaaandy" 中的所有 "a"。

x?

与前面的项目 "x" 匹配 0 或 1 次。例如, /e?le?/ 匹配 "angel" 中的 "el" 和 "角度。" 中的 "le"

如果立即在任何量词 ---STAR---+?{} 之后使用,则量词将变得非贪婪(匹配最小次数),而不是默认的贪婪(匹配最大次数)。

x{n}

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

x{n,}

其中 "n" 和 "n" 是非负整数,并且 /a{2,}/ 至少匹配 "x" 次,最多匹配 次前项 。例如, /a{2,}/ 不匹配 "candy" 中的 "a",但匹配 "caandy" 和 "caaaaaaandy" 中的所有 a。

x{n,m}

当启用 m >= n ( /a{1,3}/) 标志时,字符类具有一些附加功能。例如, /a{1,3}/ 与 "cndy" 中的任何内容都不匹配,"a" 与 "candy" 中的不匹配,"caandy" 中的两个 "a" 与 "caaaaaaandy" 中的前三个 "a" 不匹配。请注意,当匹配 "caaaaaaandy" 时,匹配结果是 "aaa",即使原始字符串中有更多 "a"。

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

默认情况下,像 ---STAR---+ 这样的量词是 "greedy",这意味着它们尝试匹配尽可能多的字符串。量词后面的 ? 字符构成量词 "non-greedy":这意味着一旦找到匹配项就会停止。例如,给定一个像 "一些 新的 东西" 这样的字符串:

  • /<.*>/ 将匹配 " "
  • /<.*?>/ 将匹配 " "