文章目录
- [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)
- [1. `CASE_INSENSITIVE`](#1.
- [🚀 总结](#🚀 总结)
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(提高可读性)
- 可以组合使用(用
|),灵活应对复杂场景。