RegExp Extended Mode and Comments S1
中文标题:正则表达式扩展模式与注释
- 阶段: Stage 1
- 状态: 进行中
- ECMAScript 版本: —
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案为 JavaScript 正则表达式引入了扩展模式(x 标志),将未转义的空白视为无关紧要,从而支持多行模式。它还增加了内联注释 (?#.) 和以 # 开头的行注释(后者需要 x 模式)。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
ECMAScript 正则表达式扩展模式与注释
状态
阶段:1
倡导者: Ron Buckton (@rbuckton)
有关此提案的详细状态,请参见下面的 TODO。
作者
- Ron Buckton (@rbuckton)
动机
正则表达式扩展模式是多种正则表达式引擎普遍支持的一项功能,它通过引入不重要的空白和注释,使得编写更易于阅读和理解的正则表达式成为可能。
现有实现
- Perl: 注释, 行注释
- PCRE: 注释, 行注释
- Boost.Regex: 注释
- .NET: 注释, 行注释
- Oniguruma: 注释
- Hyperscan: 注释
- ICU: 注释, 行注释
- Glib/GRegex: 注释, 行注释
参见 https://rbuckton.github.io/regexp-features/features/comments.html 和 https://rbuckton.github.io/regexp-features/features/line-comments.html 获取更多信息。
语法
标志
扩展模式 (x)
现有实现: Perl, PCRE, Boost.Regex, .NET, Oniguruma, Hyperscan, ICU, Glib/GRegex (功能比较)
扩展模式 (x) 标志将未转义的空白字符视为无关紧要,从而允许多行正则表达式。它还启用了行注释。
注意:
x模式标志可以在修饰符内部使用。
注意:虽然
x模式标志可以在_正则表达式字面量_中使用,但它不允许在_正则表达式字面量_中使用_行终止符_。对于多行正则表达式,你需要使用RegExp构造函数。
注意:Perl 原始的
x模式将空白视为在模式中的任何位置都无关紧要,除了字符类内部。Perl v5.26 引入了xx标志,它还会忽略非转义的 SPACE 和 TAB 字符。如果我们选择采用x模式标志,我们可以一开始就选择将其视为 Perl 的xx模式。
内联注释
现有实现: Perl, PCRE, Boost.Regex, .NET, Oniguruma, Hyperscan, ICU, Glib/GRegex (功能比较)
内联注释是被模式匹配忽略的字符序列,可用于记录模式。
(?#comment)— 整个表达式将从模式中移除。- comment 的文本不能包含其他
(或)字符(相反,它们必须被转义)。 - 解析_正则表达式字面量_时,comment 的文本也不能包含
/(除非它被转义)。- 注意:可能还需要转义
[和],除非我们能够在规范中更改_正则表达式主体_的定义,以便允许在 comment 内出现不平衡的[和]对。参见 Issue #1。
- 注意:可能还需要转义
- comment 的文本不能包含其他
注意:这与现有语法没有冲突,因为 ECMAScript 目前对
u和非u模式下的此语法都会产生错误。
行注释
现有实现: Perl, PCRE, .NET, ICU, Glib/GRegex (功能比较)
行注释是以 # 开头并以 \n(或模式结束)结尾的字符序列,被模式匹配忽略,可用于记录模式。
# comment— 多行 RegExp 中的行注释
注意:需要
x模式标志。
注意:在
x模式下,字符类之外的#字符必须被转义(使用\#)。
注意:在正则表达式字面量中,
x模式不支持行注释。
示例
无关紧要的空白
注释
行注释
API
标志
扩展模式 (x)
API
RegExp.prototype.extended(布尔值) — 表示是否设置了x模式标志。
历史
- 2021年10月27日 — 提议进入第 1 阶段 (幻灯片)
- 结果:推进到第 1 阶段
TODO
以下是推进 TC39 提案流程 各个阶段的高层任务列表: