445. Java 正则表达式 - 边界匹配器

文章目录

  • [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.");

❌ 不匹配,因为 dogdoggie 的一部分,不是完整单词。


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 并不是紧挨着第一个结果。

这种情况常用于逐步扫描,比如日志分析。


💡 实际应用场景

  1. 行首/行尾校验
    • 验证输入是不是只包含某个单词:^yes$
    • 检查某一行是不是以分号结尾:;$
  2. 单词搜索
    • 搜索文档中独立出现的 "cat":\bcat\b,避免误匹配 "catalog"。
  3. 分词
    • 使用 \b 可以方便地识别单词边界,用于英文分词。
  4. 连续匹配
    • \G 常用于循环提取数据,比如 CSV 或者日志中的字段。

🚀 总结

  • ^$ → 行的开头和结尾
  • \b\B → 单词边界与非边界
  • \A / \Z / \z → 输入整体的开始与结束
  • \G → 上一个匹配的结束位置

边界匹配器让我们能更精确地控制匹配位置,而不仅仅是"有没有匹配"。