s (dotAll) flag for regular expressions S4
中文标题:正则表达式的
s(dotAll)标志
- 阶段: Stage 4
- 状态: 已完成
- ECMAScript 版本: ES2018
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案为 ECMAScript 正则表达式新增 s(dotAll)标志,使点 . 能够匹配包括行终止符在内的任意字符。目前,. 不匹配行终止符,开发者不得不使用 \[\\s\\S\] 或 \[^\] 等变通方法。新标志采用了其他正则表达式引擎中既定的命名,并在正则对象上提供 dotAll 访问器属性。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
ECMAScript 提案:正则表达式的 s(dotAll)标志
状态
本提案处于 TC39 流程 的第 4 阶段。
动机
在正则表达式模式中,点 . 匹配单个字符,无论该字符是什么。在 ECMAScript 中,有两个例外:
.不匹配星体字符。设置u(unicode)标志可以解决该问题。.不匹配行终止符。
ECMAScript 识别以下行终止符:
- U+000A 换行符(LF)(
\n) - U+000D 回车符(CR)(
\r) - U+2028 行分隔符
- U+2029 段分隔符
然而,根据用例不同,还有更多字符可能被视为换行符:
- U+000B 垂直制表符(
\v) - U+000C 换页符(
\f) - U+0085 下一行
这使得 . 当前的行为存在问题:
- 按设计,它排除了_某些_换行符,但并非全部,这通常与开发者的用例不符。
- 它通常被用来匹配_任意_字符,但它并不能做到这一点。
你现在看到的提案解决了后一个问题。
希望真正匹配任意字符(包括这些行终止符)的开发者无法使用 .:
相反,开发者不得不求助于晦涩的变通方法,如 [\s\S] 或 [^]:
由于匹配任意字符的需求相当普遍,其他正则表达式引擎支持一种模式,在这种模式下 . 匹配任何字符,包括行终止符。
- 支持常量以启用正则表达式标志的引擎实现了
DOTALL或SINGLELINE/s修饰符。 - 支持内嵌标志表达式的引擎实现了
(?s)。 - 支持正则表达式标志的引擎实现了
s标志。
注意将这些修饰符命名为 s(singleline 的缩写)和 dotAll 的既定传统。
一个例外是 Ruby,其中 m 标志(Regexp::MULTILINE) 也启用了 dotAll 模式。不幸的是,在 JavaScript 中对 m 标志做同样的事情会破坏向后兼容性。
提议的解决方案
我们提议为 ECMAScript 正则表达式添加一个新的 s 标志,使 . 匹配任何字符,包括行终止符。
高层 API
常见问题
向后兼容性呢?
现有正则表达式模式的含义不受本提案影响,因为需要新的 s 标志才能选择加入新行为。
dotAll 模式如何影响 multiline 模式?
这个问题可能会出现,因为 s 标志代表 singleline,这似乎与 m / multiline 相矛盾——但实际上并非如此。这有点遗憾,但我们只是遵循其他正则表达式引擎中既定的命名传统。选择任何其他标志名称只会造成更多困惑。访问器名称 dotAll 更好地描述了该标志的效果。因此,我们建议将此模式称为 dotAll 模式,而不是 singleline 模式。
两种模式相互独立,可以组合使用。multiline 模式只影响锚点,而 dotAll 模式只影响 .。
当同时设置 s(dotAll)和 m(multiline)标志时,. 匹配任何字符,同时仍然允许 ^ 和 $ 分别匹配字符串内行终止符之后和之前的位置。
规范
实现
- V8,随 Chrome 62 发布
- JavaScriptCore,随 Safari Technology Preview 39a 发布
- XS,随 2018 年 1 月 17 日更新 在 Moddable 中发布
- regexpu(转译器),启用了
{ dotAllFlag: true }选项 - RegExp Tree 的 Compat-transpiler