第 3 课
修饰符与匹配模式
全局、忽略大小写、多行、dotAll 与 Unicode 匹配。
修饰符(flags)改变引擎 如何扫描输入——而不是字符本身的含义。在 JavaScript 中,修饰符写在闭合 / 之后,或作为 new RegExp(pattern, flags) 的第二个参数。
常见修饰符(JavaScript)
| 修饰符 | 名称 | 作用 |
|---|---|---|
g | global | 查找全部匹配,而非仅第一个 |
i | ignore case | A 可匹配 a |
m | multiline | ^、$ 匹配行边界,不限于整串首尾 |
s | dotAll | . 可匹配换行 |
u | Unicode | 支持 \u{...} 与部分属性转义 |
y | sticky | 仅在 lastIndex 处匹配(高级迭代) |
其他语言有类似开关(如 re.IGNORECASE、(?i) 等),名称与细节略有不同。
全局匹配很重要
没有 g 时,String.prototype.match 与许多 exec 循环会在第一次命中后停止。日志解析与高亮工具几乎都需要 全局 模式,或显式迭代。
注意 有状态的正则对象:带 g 的 RegExp 会更新 lastIndex。若在不同字符串间复用同一实例且未重置,可能漏匹配。
多行日志
日志文件有多行。启用 m 后,^ERROR 匹配 以 ERROR 开头 的行,这通常是期望行为。无 m 时,^ 往往只表示整段文本的最开头。
与 g 组合可在粘贴内容中找到所有错误行。
dotAll 与粘贴内容
用户输入和 JSON 字符串可能含 \n。默认 . 不过行;s(dotAll)允许 . 跨行——在「匹配到闭合标记前的一切」的模式中有用,但要接受 过度匹配 的风险。
Unicode 与国际化文本
姓名、城市、slug 可能含非 ASCII 字母。u 修饰符让 JavaScript 正确处理代理对与 \p{...} 属性类。
缺少 Unicode 意识时,\w 可能漏掉国际化应用中的合法字符。
要点
当模式「一行能对、整文件不对」时,先查 修饰符——尤其是 g、m、s,再检查锚点与贪婪性。