451. Java 正则表达式 - Matcher 的 start(), end(), matches() 和 lookingAt()

📅 2026/7/2 20:16:20 👁️ 阅读次数 📝 编程学习
451. Java 正则表达式 - Matcher 的 start(), end(), matches() 和 lookingAt()

文章目录

  • 451. Java 正则表达式 - Matcher 的 `start()`, `end()`, `matches()` 和 `lookingAt()`
    • 1️⃣ 使用 `start()` 和 `end()` 方法
      • 功能:
      • 示例:统计单词 `"dog"` 出现次数
    • 2️⃣ 使用 `matches()` 和 `lookingAt()` 方法
      • 功能:
      • 示例:
      • 🔹 小技巧

451. Java 正则表达式 - Matcher 的start(),end(),matches()lookingAt()

在正则表达式培训中,理解匹配位置匹配方式非常重要。Matcher类提供了一系列方法帮助我们精确定位匹配,并判断匹配行为。


1️⃣ 使用start()end()方法

功能:

  • start():返回匹配子序列的起始索引
  • end():返回匹配子序列的结束索引 +1
  • 可以精确知道匹配的内容在原字符串中的位置。

示例:统计单词"dog"出现次数

importjava.util.regex.Pattern;importjava.util.regex.Matcher;publicclassMatcherDemo{privatestaticfinalStringREGEX="\\bdog\\b";privatestaticfinalStringINPUT="dog dog dog doggie dogg";publicstaticvoidmain(String[]args){Patternp=Pattern.compile(REGEX);Matcherm=p.matcher(INPUT);intcount=0;while(m.find()){count++;System.out.println("Match number "+count);System.out.println("start(): "+m.start());System.out.println("end(): "+m.end());}}}

输出结果:

Matchnumber1start():0end():3Matchnumber2start():4end():7Matchnumber3start():8end():11

💡说明

  • 使用\b确保"dog"是完整单词,而不是"doggie""dogg"的一部分。
  • start()end()可以结合截取子字符串,比如input.substring(m.start(), m.end())得到匹配的文本。

2️⃣ 使用matches()lookingAt()方法

功能:

  • matches():要求整个输入字符串匹配正则表达式
  • lookingAt():只要求从输入开头开始匹配,不需要覆盖整个字符串

示例:

importjava.util.regex.Pattern;importjava.util.regex.Matcher;publicclassMatchesLooking{privatestaticfinalStringREGEX="foo";privatestaticfinalStringINPUT="fooooooooooooooooo";publicstaticvoidmain(String[]args){Patternpattern=Pattern.compile(REGEX);Matchermatcher=pattern.matcher(INPUT);System.out.println("Current REGEX is: "+REGEX);System.out.println("Current INPUT is: "+INPUT);System.out.println("lookingAt(): "+matcher.lookingAt());System.out.println("matches(): "+matcher.matches());}}

输出结果:

CurrentREGEXis:fooCurrentINPUTis:fooooooooooooooooolookingAt():truematches():false

💡说明

  • lookingAt()返回true,因为输入字符串从开头就是"foo"开始。
  • matches()返回false,因为整个字符串"foooooooooooooooo"并不等于"foo"

总结

  • start()/end()→ 精确定位匹配位置
  • matches()→ 完全匹配整个输入
  • lookingAt()→ 匹配输入开头部分即可

🔹 小技巧

  1. \b边界匹配符可以避免匹配到单词的一部分
  2. start()/end()group()搭配,可轻松获取匹配文本及位置
  3. lookingAt()很适合前缀匹配场景