正则表达式

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

建议您阅读 正则表达式指南,以概述可用的正则表达式语法及其工作原理。

描述

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

  • 一组可用于该语言的字符,称为字母表
  • 连接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 具有更多 Unicode 功能的 u 模式的升级版。 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 非词边界断言
\D 字符类转义,表示非数字字符
\P {、Unicode 属性和/或值,然后是 } Unicode 字符类转义,表示没有指定 Unicode 属性的字符
\S 表示非空白字符的字符类转义
\W 表示非单词字符的字符类转义
\b 单词边界断言;在字符类内部,表示 U+0008(退格)
\c AZ 或从 az 的字母 一个字符转义,表示控制字符,其值等于字母字符值模 32
\d 表示数字字符(09)的字符类转义
\f 表示 U+000C(换页)的字符转义
\k <、一个标识符、然后是 > 一个命名反向引用
\n 表示 U+000A(换行)的字符转义
\p {、Unicode 属性和/或值,然后是 } 表示具有指定 Unicode 属性的字符的Unicode 字符类转义
\q {、一个字符串、然后是 } 仅在v 模式字符类内部有效;表示要按字面匹配的字符串
\r 表示 U+000D(回车)的字符转义
\s 表示空白字符的字符类转义
\t 表示 U+0009(水平制表符)的字符转义
\u 4 个十六进制数字;或 {、1 到 6 个十六进制数字、然后是 } 表示具有给定代码点的字符的字符转义
\v 表示 U+000B(垂直制表符)的字符转义
\w 表示单词字符(AZaz09_)的字符类转义
\x 2 个十六进制数字 表示具有给定值的字符的字符转义
\0 表示 U+0000(空字符)的字符转义

\ 后跟任何其他数字字符将成为旧版八进制转义序列,这在Unicode 感知模式中是被禁止的。

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

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

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

规范

规范
ECMAScript 语言规范
# prod-DecimalEscape
ECMAScript 语言规范
# prod-Atom
ECMAScript 语言规范
# prod-CharacterClass
ECMAScript 语言规范
# prod-CharacterClassEscape
ECMAScript 语言规范
# prod-CharacterEscape
ECMAScript 语言规范
# prod-Disjunction
ECMAScript 语言规范
# prod-Assertion
ECMAScript 语言规范
# prod-PatternCharacter
未知规范
# 语法
ECMAScript 语言规范
# prod-AtomEscape
ECMAScript 语言规范
# prod-Quantifier

浏览器兼容性

BCD 表格仅在浏览器中加载。

另请参阅