正则表达式 – 修饰符(标记)

正则表达式修饰符(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/ylastIndex 位置开始匹配(常用于连续匹配)。不加 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/flagsnew RegExp('pattern', 'flags')
  • Pythonre.compile(r'pattern', re.I | re.G | re.M)(用常量组合)。
  • 其他:如 Java 的 Pattern.compile(pattern, flags)
  • 测试工具:regex101.com 支持切换引擎和 flags,实时预览。

修饰符是正则的”调味剂”,学会组合使用能让模式更灵活。有什么具体场景想试试组合 flags 吗?

文章已创建 3511

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部