正则表达式修饰符(Flags/Modifiers)
修饰符(也叫标记或标志)是正则表达式语法的一部分,用于修改匹配行为。它们不属于模式本身,而是附加在正则表达式外部(如 JavaScript 中的 /pattern/flags),影响整个表达式的执行方式。
为什么需要修饰符?
- 默认情况下,正则匹配是区分大小写、单次匹配、单行模式的。
- 修饰符可以灵活调整这些行为,使正则更适应不同场景(如忽略大小写、全局搜索、多行处理)。
常用修饰符详解
以下是最核心的 6 个修饰符(兼容大多数引擎:JavaScript、Python、PCRE 等)。每个修饰符都是可选的,可以组合使用(如 gi 表示全局 + 忽略大小写)。
| 修饰符 | 含义 | 示例(JS 语法) | 效果说明 |
|---|---|---|---|
i | 忽略大小写(Ignore Case) | /abc/i | 匹配 “abc”、”ABC”、”AbC” 等。不加 i 时只匹配 “abc”。 |
g | 全局匹配(Global) | /abc/g | 匹配所有符合的子串,而非只返回第一个。不加 g 时默认只匹配第一个。 |
m | 多行模式(Multiline) | /^abc/m | ^ 和 $ 匹配每行的开头/结尾,而非整个字符串。不加 m 时只匹配整体。 |
s | 点号通配(Dotall) | /a.s/ | . 可以匹配换行符 \n。不加 s 时 . 排除换行符。 |
u | Unicode 支持(Unicode) | /[\u{1F600}]/u | 正确处理 Unicode 字符(如表情符号)。不加 u 时可能出错。 |
y | 粘性匹配(Sticky) | /abc/y | 从 lastIndex 位置开始匹配(常用于连续匹配)。不加 y 时从头开始。 |
1. i – 忽略大小写
- 场景:搜索不区分 ABC/abc。
- 示例:
let str = "ABC def ABC";
let regex = /abc/i;
console.log(str.match(regex)); // ["ABC"](匹配第一个)
- 注意:在某些语言中,也写作
re.IGNORECASE(Python)。
2. g – 全局匹配
- 场景:查找所有匹配项,如替换所有邮箱。
- 示例:
let str = "abc abc abc";
let regex = /abc/g;
console.log(str.match(regex)); // ["abc", "abc", "abc"](所有匹配)
console.log(str.replace(regex, "XYZ")); // "XYZ XYZ XYZ"
- 注意:不加
g时,match()只返回第一个;加g后返回数组。
3. m – 多行模式
- 场景:处理多行文本时,逐行匹配开头/结尾。
- 示例:
let str = "line1\nabc\nline3\nabc";
let regex = /^abc/m; // 匹配每行开头的 "abc"
console.log(str.match(regex)); // ["abc"](第二行)
// 不加 m:不匹配任何(因为整体不以 abc 开头)
- 注意:只影响
^和$,其他行为不变。
4. s – 点号通配(Dotall)
- 场景:匹配跨行的内容,如整个 HTML 块。
- 示例:
let str = "a\nb";
let regex = /a.b/s; // . 匹配 \n
console.log(str.match(regex)); // ["a\nb"]
// 不加 s:null(. 不匹配 \n)
- 别名:在一些引擎中也叫 “singleline” 模式。
5. u – Unicode 支持
- 场景:处理国际化文本、表情符号。
- 示例:
let str = "😊";
let regex = /\u{1F600}/u; // 正确匹配笑脸
console.log(str.match(regex)); // ["😊"]
// 不加 u:可能匹配失败或部分字符
- 注意:现代应用必备,尤其在 Web 开发中。
6. y – 粘性匹配
- 场景:连续扫描字符串(如分词器)。
- 示例:
let str = "abc123abc";
let regex = /\d+/y;
regex.lastIndex = 3; // 从索引 3 开始
console.log(str.match(regex)); // ["123"](从指定位置粘性匹配)
- 注意:较少用,但适合迭代匹配。
组合使用示例
/abc/gi:全局、忽略大小写匹配所有 “abc” 变体。/^.{1,10}$/ms:多行、点号通配,匹配每行长度 1-10 的任意内容。
语言差异提示
- JavaScript:
/pattern/flags或new RegExp('pattern', 'flags')。 - Python:
re.compile(r'pattern', re.I | re.G | re.M)(用常量组合)。 - 其他:如 Java 的
Pattern.compile(pattern, flags)。 - 测试工具:regex101.com 支持切换引擎和 flags,实时预览。
修饰符是正则的”调味剂”,学会组合使用能让模式更灵活。有什么具体场景想试试组合 flags 吗?