一文详解Java正则表达式中的边界匹配器
作者:yaoxin521123
本文介绍了Java正则表达式中的边界匹配器(Boundary Matchers),用于精确控制匹配位置,主要边界匹配符包括:^(行首)、$(行尾)、\b(单词边界)、\B(非单词边界)、\A(输入开始)、\G(上一匹配结束位置)等,需要的朋友可以参考下
在前面,我们主要关心的是:某个字符串中有没有匹配成功。但是,有时候我们还想知道:
👉 它是不是出现在行首?
👉 是不是在单词的结尾?
👉 或者是不是紧跟在上一次匹配的后面?
这些都可以通过 边界匹配器(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→ 上一个匹配的结束位置
边界匹配器让我们能更精确地控制匹配位置,而不仅仅是“有没有匹配”。
到此这篇关于一文详解Java正则表达式中的边界匹配器的文章就介绍到这了,更多相关Java正则表达式边界匹配器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
