正则表达式修饰符(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 时 . 排除换行符。
uUnicode 支持(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 吗?

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐