For AI agents: the complete documentation index is available at /tc39-atlas/llms.txt, the full documentation bundle is available at /tc39-atlas/llms-full.txt, and this page is available as Markdown at /tc39-atlas/proposals/stage/1/proposal-regexp-x-mode.md.
  • 简体中文
  • RegExp Extended Mode and Comments S1

    中文标题:正则表达式扩展模式与注释

    提案概览
    提案速览

    该提案为 JavaScript 正则表达式引入了扩展模式(x 标志),将未转义的空白视为无关紧要,从而支持多行模式。它还增加了内联注释 (?#.) 和以 # 开头的行注释(后者需要 x 模式)。

    Note

    以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。

    ECMAScript 正则表达式扩展模式与注释

    状态

    阶段:1
    倡导者: Ron Buckton (@rbuckton)

    有关此提案的详细状态,请参见下面的 TODO

    作者

    动机

    正则表达式扩展模式是多种正则表达式引擎普遍支持的一项功能,它通过引入不重要的空白和注释,使得编写更易于阅读和理解的正则表达式成为可能。

    现有实现

    参见 https://rbuckton.github.io/regexp-features/features/comments.htmlhttps://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

    注意:这与现有语法没有冲突,因为 ECMAScript 目前对 u 和非 u 模式下的此语法都会产生错误。

    行注释

    现有实现: Perl, PCRE, .NET, ICU, Glib/GRegex (功能比较)

    行注释是以 # 开头并以 \n(或模式结束)结尾的字符序列,被模式匹配忽略,可用于记录模式。

    • # comment — 多行 RegExp 中的行注释

    注意:需要 x 模式标志

    注意:在 x 模式下,字符类之外的 # 字符必须被转义(使用 \#)。

    注意:在正则表达式字面量中,x 模式不支持行注释。

    示例

    无关紧要的空白

    const re = /(foo) (bar) (baz)/x;
    re.test("foobarbaz"); // true

    注释

    const re = /foo(?#comment)bar/;
    re.test("foobar"); // true

    行注释

    const re = new RegExp(String.raw`
        # 匹配 ASCII 字母数字
        [a-zA-Z0-9]
    `, "x");

    API

    标志

    扩展模式 (x)

    API
    • RegExp.prototype.extended (布尔值) — 表示是否设置了 x 模式标志。

    历史

    • 2021年10月27日 — 提议进入第 1 阶段 (幻灯片)
      • 结果:推进到第 1 阶段

    TODO

    以下是推进 TC39 提案流程 各个阶段的高层任务列表:

    第 1 阶段进入标准

    • 确定了一位将推进该新增功能的“倡导者”。
    • 概述问题或需求以及解决方案大致形态的叙述
    • 说明用法的示例
    • 高层API

    第 2 阶段进入标准

    第 3 阶段进入标准

    第 4 阶段进入标准

    • 已为主流使用场景编写 Test262 验收测试,并且已合并
    • 两个通过验收测试的兼容实现:[1], [2]
    • 已向 tc39/ecma262 发送包含集成规范文本的拉取请求
    • ECMAScript 编辑器已在拉取请求上签字。