当前位置: 首页 > news >正文

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

文章目录

  • 445. Java 正则表达式 - 边界匹配器
    • 📌 常见的边界匹配符
    • 🔍 举例说明
      • 1. `^` 和 `$`:匹配行首和行尾
      • 2. `\b`:单词边界
      • 3. `\B`:非单词边界
      • 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→ 上一个匹配的结束位置

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

http://www.jsqmd.com/news/1084216/

相关文章:

  • 惠州管道阀门:城市命脉的守护者
  • Web应用白屏问题全链路排查:从诊断到预防的实战指南
  • C# 循环详解
  • Beyond Compare 5 密钥生成工具完整指南:5步快速获取专业版授权
  • Epilogue预热64 Operator:今年将让你在电脑及手持设备玩N64卡带游戏
  • 硬核剖析 MySQL 索引:从 B+Tree 底层到七大失效场景,一文彻底吃透
  • 伪静态注入与空格绕过:Web安全攻防中的SQL注入高级技巧
  • IPXWrapper终极指南:让经典游戏在Windows 10/11重获联机生命
  • 海盐勾兑和天然海水差在哪?械字号鼻腔喷雾的硬核品质分界线
  • 业余操作系统 Astral 移植 Wine:多款游戏运行测试,Steam 成下一步目标!
  • 能力的真伪之辨——从“做到极致”到“只会吟诗”
  • SSRF漏洞深度解析:从攻击原理到多层次防御实战
  • 建材行业数据驱动的全铝门工艺体系优化与风险规避分析
  • 杰理之超距不回连问题【篇】
  • 晶振故障分析与索斯特三防解决方案详解
  • 2026最新各类命理软件观察:命理排盘软件怎么判断是否适合新手?
  • 产线仿真一定要写代码吗?分享一个不用编程的实操方法
  • AI驱动SQL注入自动化修复:从原理到Java工程实践
  • Easysearch 布尔查询优化(上)|写法不影响顺序,结构才影响性能
  • CVE漏洞实战:从复现到修复的完整生命周期剖析
  • Google Wallet 新增护照创建身份通行证功能,机场安检免出示身份证件!
  • 昭通黄金白银回收铂金旧金回收无套路门店 TOP 榜单 实地测评资料整理
  • Easysearch 布尔查询优化(下)|找 Top-K 时,如何跳过注定落选的文档
  • 机器人学习数据层成本高?各环节问题大揭秘!
  • 本地模型也能懂逻辑,Ryzen AI 数学推理能力测试
  • 同样是铝合金液冷板,为什么3003和6061的焊接难度差了3倍?
  • 华为eNSP企业园区网综合实验笔记
  • 文档下载困境:30+平台内容如何高效获取?
  • q-Stancu算子:基于q-Pochhammer符号的量子逼近与经典极限分析
  • Flutter:一款免费开源的 SDK,助力开发者打造多平台高效应用!