446. Java 正则表达式 - 模式修饰符

文章目录

  • [446. Java 正则表达式 - 模式修饰符](#446. Java 正则表达式 - 模式修饰符)
    • [📌 常见 Flags 及作用](#📌 常见 Flags 及作用)
    • [🔍 示例讲解](#🔍 示例讲解)
      • [1. `CASE_INSENSITIVE`](#1. CASE_INSENSITIVE)
      • [2. 组合 Flags(用 `|`)](#2. 组合 Flags(用 |))
      • [3. `COMMENTS` 模式(写可读正则)](#3. COMMENTS 模式(写可读正则))
      • [4. `DOTALL` 模式](#4. DOTALL 模式)
      • [5. `LITERAL` 模式](#5. LITERAL 模式)
      • [6. 使用变量保存 Flags](#6. 使用变量保存 Flags)
    • [🚀 总结](#🚀 总结)

446. Java 正则表达式 - 模式修饰符

在前面,我们用 Pattern.compile(regex) 来编译一个正则表达式。但有时候,我们希望匹配更灵活,比如 忽略大小写支持多行模式. 匹配换行符 等。这些功能就需要用到 Pattern Flags(模式修饰符)

👉 Pattern 类提供了一个重载方法,可以带上这些 flags:

java 复制代码
Pattern pattern = Pattern.compile("dog", Pattern.CASE_INSENSITIVE);

这样,我们就可以控制正则的匹配行为。


📌 常见 Flags 及作用

Flag 含义 示例 & 说明
Pattern.CANON_EQ 启用规范等价。两个字符只要分解后等价,就能匹配。 "a\u030A"(a + 上环) ≈ "\u00E5"(å)。⚠️ 可能影响性能。
Pattern.CASE_INSENSITIVE 忽略大小写匹配。 "dog" 可以匹配 "Dog", "DOg", "DOG"。可结合 UNICODE_CASE 让 Unicode 也生效。
Pattern.COMMENTS 忽略正则里的空格和注释(# 开头)。 适合写复杂正则时增加可读性。例子见下。
Pattern.DOTALL . 可以匹配换行符。 默认 . 不会匹配 \n,加上这个 flag 后就会匹配。
Pattern.LITERAL 按字面量解析,不把元字符当特殊符号。 正则 "a.b" 就只会匹配 a.b,不会把 . 当"任意字符"。
Pattern.MULTILINE ^$ 会匹配每一行的开头/结尾,而不仅是整个文本。 适合多行文本处理。
Pattern.UNICODE_CASE CASE_INSENSITIVE 在 Unicode 下也生效。 比如德语中的 ßSS
Pattern.UNIX_LINES 只把 \n 当行终止符。 默认会识别 \r\n\r 等,开启后只认 \n

🔍 示例讲解

1. CASE_INSENSITIVE

java 复制代码
Pattern pattern = Pattern.compile("dog", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("DoGDOg");

while (matcher.find()) {
    System.out.println("Found: " + matcher.group());
}

✅ 输出:

java 复制代码
Found: DoG
Found: DOg

👉 不论大小写,都能匹配。


2. 组合 Flags(用 |

java 复制代码
Pattern pattern = Pattern.compile("[az]$", Pattern.MULTILINE | Pattern.UNIX_LINES);

这里用了两个 flag:

  • MULTILINE$ 匹配每一行的行尾
  • UNIX_LINES → 行尾只认 \n

3. COMMENTS 模式(写可读正则)

java 复制代码
Pattern pattern = Pattern.compile(
    "(?x)        # 开启 COMMENTS 模式\n" +
    "dog         # 匹配单词 dog\n" +
    "\\s+        # 一个或多个空格\n" +
    "cat         # 匹配单词 cat"
);

Matcher matcher = pattern.matcher("dog   cat");
System.out.println(matcher.matches()); // true

👉 在 COMMENTS 模式下,正则可以加注释,空格也会被忽略。


4. DOTALL 模式

java 复制代码
String text = "hello\nworld";
Pattern p1 = Pattern.compile("hello.world");
Pattern p2 = Pattern.compile("hello.world", Pattern.DOTALL);

System.out.println(p1.matcher(text).matches());  // false
System.out.println(p2.matcher(text).matches());  // true

👉 默认 . 不会匹配换行符,加了 DOTALL 才能跨行匹配。


5. LITERAL 模式

java 复制代码
Pattern p = Pattern.compile("a.b", Pattern.LITERAL);
Matcher m = p.matcher("a.b");
System.out.println(m.matches()); // true

👉 在 LITERAL 模式下,. 就是普通的点号,不会当"任意字符"。


6. 使用变量保存 Flags

java 复制代码
int flags = Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE;
Pattern pattern = Pattern.compile("straße", flags);
System.out.println(pattern.matcher("STRASSE").matches()); // true

👉 结合 UNICODE_CASE 后,ßSS 也能匹配。


🚀 总结

  • Flags 就像正则的"模式开关",能改变匹配方式。
  • 常用:
    • CASE_INSENSITIVE(忽略大小写)
    • MULTILINE(多行模式)
    • DOTALL(让 . 匹配换行)
    • COMMENTS(提高可读性)
  • 可以组合使用(用 |),灵活应对复杂场景。