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 行为:
- 写法:在正则字面量末尾添加
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>(.*?)/s;<br> html.match(re)[1].trim(); // "Hello\nWorld" <p>⚠️ 注意:如果未加 <code>s</code>,<code>.*?</code> 在换行处会立即停止,导致匹配失败或截断。</p> <h3>兼容性与替代方案</h3> <p><code>s</code> 修饰符在现代浏览器(Chrome 62+、Firefox 78+、Safari 15.4+、Node.js 8.10+)及主流运行时中已广泛支持。若需兼容旧环境:</p> <ul> <li>用 <code>[\s\S]</code> 替代 <code>.</code>(最常用,语义明确)</li> <li>用 <code>[\d\D]</code> 或 <code>[\w\W]</code> 效果相同,但可读性略低</li> <li>避免使用 <code>.*</code> 配合 <code>m</code>(multiline)修饰符——<code>m</code> 只影响 <code>^</code> 和 <code>$</code>,对 <code>.</code> 无效</li> </ul> <p>不复杂但容易忽略。</p> </div>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











