文章目录
- [445. Java 正则表达式 - 边界匹配器](#445. Java 正则表达式 - 边界匹配器)
-
- [📌 常见的边界匹配符](#📌 常见的边界匹配符)
- [🔍 举例说明](#🔍 举例说明)
-
- [1. `^` 和 `\`:匹配行首和行尾](#1. `^` 和 ``:匹配行首和行尾)
- [2. `\b`:单词边界](#2.
\b:单词边界) - [3. `\B`:非单词边界](#3.
\B:非单词边界) - [4. `\G`:上一个匹配的结束位置](#4.
\G:上一个匹配的结束位置)
- [💡 实际应用场景](#💡 实际应用场景)
- [🚀 总结](#🚀 总结)
445. Java 正则表达式 - 边界匹配器
在前面,我们主要关心的是:某个字符串中有没有匹配成功 。但是,有时候我们还想知道:
👉 它是不是出现在行首?
👉 是不是在单词的结尾?
👉 或者是不是紧跟在上一次匹配的后面?
这些都可以通过 边界匹配器(Boundary Matchers) 来精确控制。
📌 常见的边界匹配符
| 边界构造符 | 描述 |
|---|---|
^ |
一行的开始 |
$ |
一行的结束 |
\b |
单词边界(word boundary) |
\B |
非单词边界 |
\A |
输入的开始(整个文本,不受多行模式影响) |
\G |
上一个匹配的结束位置 |
\Z |
输入的结束(忽略最后的换行符) |
\z |
输入的真正结束(包含换行符) |
🔍 举例说明
1. ^ 和 $:匹配行首和行尾
Pattern p = Pattern.compile("^dog$");
Matcher m = p.matcher("dog");
✅ 输出:匹配成功,因为整个字符串就是 dog。
但如果前面多了空格呢?
Pattern p = Pattern.compile("^dog$");
Matcher m = p.matcher(" dog");
❌ 不匹配,因为前面多了空格,^ 要求必须是行首。
那我们允许空格呢?
Pattern p = Pattern.compile("^\\s*dog$");
Matcher m = p.matcher(" dog");
✅ 匹配成功,\s* 表示前面可以有任意多个空格。
2. \b:单词边界
单词边界的意思是:匹配的单词必须是完整的,而不是单词中的一部分。
Pattern p = Pattern.compile("\\bdog\\b");
Matcher m = p.matcher("The dog plays in the yard.");
✅ 匹配成功,因为 dog 独立存在。
Pattern p = Pattern.compile("\\bdog\\b");
Matcher m = p.matcher("The doggie plays in the yard.");
❌ 不匹配,因为 dog 是 doggie 的一部分,不是完整单词。
3. \B:非单词边界
和 \b 相反,要求匹配的部分 不能 在单词的边界上。
Pattern p = Pattern.compile("\\bdog\\B");
Matcher m = p.matcher("The doggie plays in the yard.");
✅ 匹配成功,这里 dog 出现在 doggie 的开头,不是独立的单词。
Pattern p = Pattern.compile("\\bdog\\B");
Matcher m = p.matcher("The dog plays in the yard.");
❌ 不匹配,因为 dog 是一个完整单词。
4. \G:上一个匹配的结束位置
\G 可以用来 连续匹配,要求新匹配必须紧跟上一个。
Pattern p1 = Pattern.compile("dog");
Matcher m1 = p1.matcher("dog dog");
✅ 会找到两个结果:dog(0-3) 和 dog(4-7)。
但如果我们用 \G:
Pattern p2 = Pattern.compile("\\Gdog");
Matcher m2 = p2.matcher("dog dog");
✅ 只找到第一个,因为第二个 dog 并不是紧挨着第一个结果。
这种情况常用于逐步扫描,比如日志分析。
💡 实际应用场景
- 行首/行尾校验
- 验证输入是不是只包含某个单词:
^yes$。 - 检查某一行是不是以分号结尾:
;$。
- 验证输入是不是只包含某个单词:
- 单词搜索
- 搜索文档中独立出现的 "cat":
\bcat\b,避免误匹配 "catalog"。
- 搜索文档中独立出现的 "cat":
- 分词
- 使用
\b可以方便地识别单词边界,用于英文分词。
- 使用
- 连续匹配
\G常用于循环提取数据,比如 CSV 或者日志中的字段。
🚀 总结
^和$→ 行的开头和结尾\b和\B→ 单词边界与非边界\A/\Z/\z→ 输入整体的开始与结束\G→ 上一个匹配的结束位置
边界匹配器让我们能更精确地控制匹配位置,而不仅仅是"有没有匹配"。