正则表达式

正则表达式(简称 regex)允许开发者将字符串与模式进行匹配,提取子匹配信息,或简单地测试字符串是否符合该模式。正则表达式在许多编程语言中都有使用,而 JavaScript 的语法则受到了 Perl 的启发。

建议你阅读正则表达式指南,以了解可用的 regex 语法及其工作原理。

描述

正则表达式是形式语言理论中的一个重要概念。它们是一种描述可能无限的字符集(称为语言)的方式。正则表达式的核心需要以下特性:

  • 可以在语言中使用的字符集,称为字母表
  • 连接ab 表示“字符 a 后跟字符 b”。
  • 联合a|b 表示“ab”。
  • Kleene 星号a* 表示“零个或多个 a 字符”。

假设有一个有限的字母表(例如英语字母表的 26 个字母,或整个 Unicode 字符集),所有正则语言都可以通过上述特性生成。当然,许多模式以这种方式表达非常繁琐(例如“10 位数字”或“不是空格的字符”),因此 JavaScript 正则表达式包含许多速记方式,将在下面介绍。

注意:由于存在反向引用(正则表达式必须具有有限状态),JavaScript 正则表达式实际上并非正则的。但是,它们仍然是非常有用的特性。

创建正则表达式

正则表达式通常通过将模式用正斜杠(/)括起来作为字面量创建。

js
const regex1 = /ab+c/g;

正则表达式也可以通过 RegExp() 构造函数创建。

js
const regex2 = new RegExp("ab+c", "g");

它们在运行时没有差异,尽管它们可能会对性能、静态可分析性和字符转义的编写人体工程学产生影响。有关更多信息,请参阅 RegExp 参考。

正则表达式标志

标志是特殊的参数,可以改变正则表达式的解释方式或其与输入文本的交互方式。每个标志都对应于 RegExp 对象上的一个访问器属性。

标志 描述 对应属性
d 为子字符串匹配生成索引。 hasIndices
g 全局搜索。 global
i 不区分大小写的搜索。 ignoreCase
m 使 ^$ 匹配每行的开头和结尾,而不是整个字符串的开头和结尾。 multiline
s 允许 . 匹配换行符。 dotAll
u “Unicode”;将模式视为 Unicode 码点序列。 unicode
v u 模式的升级版,具有更多 Unicode 功能。 unicodeSets
y 执行“粘性”搜索,从目标字符串中的当前位置开始匹配。 sticky

ims 标志可以使用修饰符语法在正则表达式的特定部分启用或禁用。

以下部分列出了所有可用的正则表达式语法,按其语法性质分组。

断言

断言是测试字符串在指定位置是否满足特定条件但不消耗字符的构造。断言不能量化

输入边界断言:^$

断言当前位置是输入的开始或结束,如果设置了 m 标志,则为行的开始或结束。

先行断言:(?=...)(?!...)

断言当前位置后面是或不是某个模式。

后行断言:(?<=...)(?<!...)

断言当前位置前面是或不是某个模式。

单词边界断言:\b\B

断言当前位置是单词边界。

原子

原子是正则表达式最基本的单元。每个原子消耗字符串中的一个或多个字符,然后匹配失败或允许模式继续与下一个原子匹配。

反向引用:\1\2

匹配先前用捕获组捕获的子模式。

捕获组:(...)

匹配子模式并记住有关匹配的信息。

字符类:[...][^...]

匹配字符集中或不在字符集中的任何字符。当v 标志启用时,它也可以用于匹配有限长度的字符串。

字符类转义:\d\D\w\W\s\S

匹配预定义字符集中或不在预定义字符集中的任何字符。

字符转义:\n\u{...}

匹配可能无法方便地以其字面形式表示的字符。

字面量字符:ab

匹配特定字符。

修饰符:(?ims-ims:...)

覆盖正则表达式特定部分的标志设置。

命名反向引用:\k<name>

匹配先前用命名捕获组捕获的子模式。

命名捕获组:(?<name>...)

匹配子模式并记住有关匹配的信息。该组以后可以通过自定义名称而不是其在模式中的索引来识别。

非捕获组:(?:...)

匹配子模式而不记住有关匹配的信息。

Unicode 字符类转义:\p{...}\P{...}

匹配由 Unicode 属性指定的一组字符。当v 标志启用时,它也可以用于匹配有限长度的字符串。

通配符:.

匹配除行终止符之外的任何字符,除非设置了 s 标志。

其他特性

这些特性本身不指定任何模式,但用于组合模式。

析取:|

匹配由 | 字符分隔的一组备选项中的任何一个。

量词:*+?{n}{n,}{n,m}

匹配原子特定次数。

转义序列

正则表达式中的转义序列指的是由 \ 后跟一个或多个字符组成的任何语法。它们可能根据 \ 后跟的内容而具有非常不同的目的。下面列出了所有有效的“转义序列”

转义序列 后跟 含义
\B None 非单词边界断言
\D None 字符类转义表示非数字字符
\P {,一个 Unicode 属性和/或值,然后是 } Unicode 字符类转义表示没有指定 Unicode 属性的字符
\S None 字符类转义表示非空白字符
\W None 字符类转义表示非单词字符
\b None 单词边界断言;在字符类内部,表示 U+0008 (BACKSPACE)
\c AZaz 的字母 一个字符转义表示控制字符,其值等于字母的字符值模 32
\d None 字符类转义表示数字字符(09
\f None 字符转义表示 U+000C (FORM FEED)
\k <,一个标识符,然后是 > 一个命名反向引用
\n None 字符转义表示 U+000A (LINE FEED)
\p {,一个 Unicode 属性和/或值,然后是 } Unicode 字符类转义表示具有指定 Unicode 属性的字符
\q {,一个字符串,然后是 } 仅在v 模式字符类中有效;表示要字面匹配的字符串
\r None 字符转义表示 U+000D (CARRIAGE RETURN)
\s None 字符类转义表示空白字符
\t None 字符转义表示 U+0009 (CHARACTER TABULATION)
\u 4 个十六进制数字;或 {,1 到 6 个十六进制数字,然后是 } 字符转义表示具有给定码点的字符
\v None 字符转义表示 U+000B (LINE TABULATION)
\w None 字符类转义表示单词字符(AZaz09_
\x 2 个十六进制数字 字符转义表示具有给定值的字符
\0 None 字符转义表示 U+0000 (NULL)

\ 后跟 0 和另一个数字成为遗留八进制转义序列,在Unicode 感知模式中是禁止的。\ 后跟任何其他数字序列成为反向引用

此外,\ 可以后跟一些非字母或非数字字符,在这种情况下,转义序列始终是字符转义,表示转义字符本身

  • \$, \(, \), \*, \+, \., \/, \?, \[, \\, \], \^, \{, \|, \}:随处有效
  • \-:仅在字符类中有效
  • \!, \#, \%, \&, \,, \:, \;, \<, \=, \>, \@, \`, \~:仅在v 模式字符类中有效

其他 ASCII 字符,即空格字符、"'_ 和任何上述未提及的字母字符,都不是有效的转义序列。在Unicode 非感知模式中,不是上述之一的转义序列成为标识转义:它们表示反斜杠后面的字符。例如,\a 表示字符 a。这种行为限制了在不引起向后兼容性问题的情况下引入新转义序列的能力,因此在 Unicode 感知模式中是被禁止的。

规范

规范
ECMAScript® 2026 语言规范
# prod-CharacterClassEscape
ECMAScript® 2026 语言规范
# prod-Assertion
ECMAScript® 2026 语言规范
# prod-CharacterClass
ECMAScript® 2026 语言规范
# prod-PatternCharacter
ECMAScript® 2026 语言规范
# prod-Atom
ECMAScript® 2026 语言规范
# prod-DecimalEscape
ECMAScript® 2026 语言规范
# prod-CharacterEscape
ECMAScript® 2026 语言规范
# prod-AtomEscape
ECMAScript® 2026 语言规范
# prod-Quantifier
ECMAScript® 2026 语言规范
# prod-Disjunction
ECMAScript® 2026 语言规范
# prod-RegularExpressionModifiers

浏览器兼容性

另见