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/4/proposal-regexp-dotall-flag.md.
  • 简体中文
  • s (dotAll) flag for regular expressions S4

    中文标题:正则表达式的 sdotAll)标志

    提案概览
    提案速览

    该提案为 ECMAScript 正则表达式新增 s(dotAll)标志,使点 . 能够匹配包括行终止符在内的任意字符。目前,. 不匹配行终止符,开发者不得不使用 \[\\s\\S\]\[^\] 等变通方法。新标志采用了其他正则表达式引擎中既定的命名,并在正则对象上提供 dotAll 访问器属性。

    Note

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

    ECMAScript 提案:正则表达式的 sdotAll)标志

    状态

    本提案处于 TC39 流程 的第 4 阶段。

    动机

    在正则表达式模式中,点 . 匹配单个字符,无论该字符是什么。在 ECMAScript 中,有两个例外:

    • . 不匹配星体字符。设置 uunicode)标志可以解决该问题。
    • . 不匹配行终止符

    ECMAScript 识别以下行终止符:

    • U+000A 换行符(LF)(\n
    • U+000D 回车符(CR)(\r
    • U+2028 行分隔符
    • U+2029 段分隔符

    然而,根据用例不同,还有更多字符可能被视为换行符

    • U+000B 垂直制表符(\v
    • U+000C 换页符(\f
    • U+0085 下一行

    这使得 . 当前的行为存在问题:

    • 按设计,它排除了_某些_换行符,但并非全部,这通常与开发者的用例不符。
    • 它通常被用来匹配_任意_字符,但它并不能做到这一点。

    你现在看到的提案解决了后一个问题。

    希望真正匹配任意字符(包括这些行终止符)的开发者无法使用 .

    /foo.bar/.test('foo\nbar');
    // → false

    相反,开发者不得不求助于晦涩的变通方法,如 [\s\S][^]

    /foo[^]bar/.test('foo\nbar');
    // → true

    由于匹配任意字符的需求相当普遍,其他正则表达式引擎支持一种模式,在这种模式下 . 匹配任何字符,包括行终止符。

    • 支持常量以启用正则表达式标志的引擎实现了 DOTALLSINGLELINE/s 修饰符。
      • Java 支持 Pattern.DOTALL
      • C# 和 VB 支持 RegexOptions.Singleline
      • Python 同时支持 re.DOTALLre.S
    • 支持内嵌标志表达式的引擎实现了 (?s)
    • 支持正则表达式标志的引擎实现了 s 标志。

    注意将这些修饰符命名为 ssingleline 的缩写)和 dotAll 的既定传统。

    一个例外是 Ruby,其中 m 标志(Regexp::MULTILINE 也启用了 dotAll 模式。不幸的是,在 JavaScript 中对 m 标志做同样的事情会破坏向后兼容性。

    提议的解决方案

    我们提议为 ECMAScript 正则表达式添加一个新的 s 标志,使 . 匹配任何字符,包括行终止符。

    /foo.bar/s.test('foo\nbar');
    // → true

    高层 API

    const re = /foo.bar/s; // 或者 `const re = new RegExp('foo.bar', 's');`。
    re.test('foo\nbar');
    // → true
    re.dotAll
    // → true
    re.flags
    // → 's'

    常见问题

    向后兼容性呢?

    现有正则表达式模式的含义不受本提案影响,因为需要新的 s 标志才能选择加入新行为。

    dotAll 模式如何影响 multiline 模式?

    这个问题可能会出现,因为 s 标志代表 singleline,这似乎与 m / multiline 相矛盾——但实际上并非如此。这有点遗憾,但我们只是遵循其他正则表达式引擎中既定的命名传统。选择任何其他标志名称只会造成更多困惑。访问器名称 dotAll 更好地描述了该标志的效果。因此,我们建议将此模式称为 dotAll 模式,而不是 singleline 模式

    两种模式相互独立,可以组合使用。multiline 模式只影响锚点,而 dotAll 模式只影响 .

    当同时设置 sdotAll)和 mmultiline)标志时,. 匹配任何字符,同时仍然允许 ^$ 分别匹配字符串内行终止符之后和之前的位置。

    规范

    实现