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()→ 匹配输入开头部分即可
🔹 小技巧
\b边界匹配符可以避免匹配到单词的一部分start()/end()与group()搭配,可轻松获取匹配文本及位置lookingAt()很适合前缀匹配场景
