dotAll模式(s修饰符)使正则中点号.能匹配换行符等所有Unicode字符,解决默认不跨行问题;ES2018引入,语法为/pattern/s或new RegExp("p","s"),现代环境广泛支持,旧环境可用[\s\S]替代。

JavaScript 中的 dotAll 模式(也称 s 修饰符)让正则表达式中的点号 . 能匹配包括换行符在内的所有 Unicode 字符,解决传统正则中 . 默认不匹配换行符(\n、\r、\u2028、\u2029 等)的问题。
为什么需要 dotAll 模式
默认情况下,. 等价于 [^\n\r\u2028\u2029],无法跨行匹配。例如:
const re = /a.b/;re.test("a\nb"); // false —— 因为 . 不匹配 \n
若想匹配多行文本中的任意字符(如解析 HTML 片段、提取多行注释、处理带换行的 JSON 字符串),就必须绕过限制——过去常用 [\s\S] 或 [\d\D] 替代 .,但可读性差、语义不清。
s 修饰符的用法与语法
ES2018 正式引入 s 修饰符,启用 dotAll 行为:
立即学习“Java免费学习笔记(深入)”;
- 写法:在正则字面量末尾添加
s,如/pattern/s - 构造函数中通过
flags参数传入:new RegExp("pattern", "s") - 支持与其他修饰符组合,如
/pattern/gis(全局、忽略大小写、dotAll) - 仅影响
.的行为,不影响\s、\S、^、$等其他元字符的匹配逻辑
实际使用示例
✅ 正确跨行匹配:
const re = /a.b/s;<br>
re.test("a\nb"); // true
✅ 提取多行 HTML 标签内容:
const html = `<div>\n Hello\n World\n</div>`;<br> const re = /<div>(.*?)<\/div>/s;<br> html.match(re)[1].trim(); // "Hello\nWorld"
⚠️ 注意:如果未加 s,.*? 在换行处会立即停止,导致匹配失败或截断。
兼容性与替代方案
s 修饰符在现代浏览器(Chrome 62+、Firefox 78+、Safari 15.4+、Node.js 8.10+)及主流运行时中已广泛支持。若需兼容旧环境:
- 用
[\s\S]替代.(最常用,语义明确) - 用
[\d\D]或[\w\W]效果相同,但可读性略低 - 避免使用
.*配合m(multiline)修饰符——m只影响^和$,对.无效
不复杂但容易忽略。


















