正则表达式六个常用标志位为i、g、m、s、u、y:i忽略大小写;g全局匹配;m使^/$匹配每行首尾;s让.匹配换行符;u启用unicode完整支持;y强制从lastindex粘性匹配。

正则表达式标志位(Flags)是写在正则字面量末尾的单字母修饰符,直接控制匹配引擎的行为。它们不参与模式匹配本身,但会显著改变 ^、$、.、大小写判断、匹配范围等关键逻辑。掌握这六个常用标志——i、g、m、s、u、y,能避免大量隐性错误,让正则真正“按你所想”工作。
i:忽略大小写匹配
启用后,所有字母字符自动忽略大小写差异。比如 /hello/i 能同时匹配 "Hello"、"HELLO"、"hElLo" 等任意大小写组合。
- 只影响 ASCII 字母 a–z 和 A–Z;对 Unicode 字符(如带重音的 é、É)默认无效,需配合 u 标志才可靠
- 常与 g 组合使用,例如
/user/gi全局查找所有形式的 “user” - 注意:它不改变替换内容的大小写——
"HELLO".replace(/hello/i, "hi")结果是"hi",不是"Hi"或保持原大小写
g:全局匹配
让正则引擎持续搜索,直到字符串末尾,返回所有匹配项(而非仅第一个)。没有 g 时,.match()、.replace() 等方法默认只处理首次匹配。
-
"a a a".match(/a/)→["a"];加 g 后 →["a", "a", "a"] -
.exec()在带 g 时可多次调用,每次推进 lastIndex;无 g 则每次从头开始,lastIndex 不更新 - ⚠️ 注意:
test()方法即使带 g 也只返回布尔值,不维护 lastIndex,因此连续调用可能行为异常
m:多行模式
改变 ^ 和 $ 的语义:它们不再只锚定整个字符串的开头和结尾,而是匹配每一行的起始与结束位置(即换行符 \n 或 \r\n 分隔的“行”)。
- 典型场景:处理日志、配置文件或用户输入的多行文本,例如
/^ERROR:/gm匹配每行开头的 ERROR - 单独用 m 不影响其他元字符(如
.仍不匹配换行符),要让它跨行匹配需额外加 s - 注意:m 不等于“支持换行”,它只是重新定义了
^/$的作用范围;字符串本身是否含换行符由输入决定
s:单行模式(dotAll)
让点号 . 元字符匹配**包括换行符在内的所有字符**。默认情况下,. 会跳过 \n、\r、\u2028、\u2029 等行终止符。
- 例如:
/a.b/不匹配"a\nb";加 s 后/a.b/s可匹配 - 常用于提取跨行内容,如 HTML 标签、JSON 片段或注释块:
/<!--[\s\S]*?-->/s可安全匹配多行注释 - ⚠️ 替代方案:
[\s\S]或[\d\D]也能匹配任意字符(含换行),但不如 s 清晰且性能略优
u:Unicode 模式
启用完整的 Unicode 支持,让正则引擎以 Unicode 代码点(而非 UTF-16 代码单元)为单位处理字符。
- 解决代理对(surrogate pairs)问题:如 emoji ?(U+1F602)在无 u 时被当作两个字符,导致
/.{2}/.test("?")返回 true;加 u 后正确识别为一个字符 - 支持 Unicode 属性转义,如
\p{Letter}、\p{Emoji}(必须搭配 u 才生效) - 使
\w、\W、\b等边界类匹配 Unicode 字母数字,而不仅限于 ASCII
y:粘性匹配(Sticky)
强制正则从 lastIndex 指定的位置**精确开始匹配**,不跳过任何字符。匹配成功后,lastIndex 自动更新为匹配结束位置;失败则 lastIndex 不变。
- 与 g 的关键区别:g 允许“跳过不匹配字符再试”,y 要求“必须从当前位置起严格匹配”
- 典型用途:解析器分词、流式文本处理、确保无遗漏或重叠——例如
/\d+/y在字符串"123abc456"中,第一次匹配"123",lastIndex变为 3;第二次从索引 3 开始尝试,遇到"a"失败,不会跳到"456" - 必须配合
.exec()或.test()使用,.match()忽略 y











