文章目录
- [451. Java 正则表达式 - Matcher 的 `start()`, `end()`, `matches()` 和 `lookingAt()`](#451. Java 正则表达式 - Matcher 的
start(),end(),matches()和lookingAt())
451. Java 正则表达式 - Matcher 的 start(), end(), matches() 和 lookingAt()
在正则表达式培训中,理解 匹配位置 和 匹配方式 非常重要。Matcher 类提供了一系列方法帮助我们精确定位匹配,并判断匹配行为。
1️⃣ 使用 start() 和 end() 方法
功能:
start():返回匹配子序列的 起始索引end():返回匹配子序列的 结束索引 +1- 可以精确知道匹配的内容在原字符串中的位置。
示例:统计单词 "dog" 出现次数
java
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class MatcherDemo {
private static final String REGEX = "\\bdog\\b";
private static final String INPUT = "dog dog dog doggie dogg";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT);
int count = 0;
while(m.find()) {
count++;
System.out.println("Match number " + count);
System.out.println("start(): " + m.start());
System.out.println("end(): " + m.end());
}
}
}
输出结果:
java
Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
💡 说明:
- 使用
\b确保"dog"是完整单词,而不是"doggie"或"dogg"的一部分。 start()和end()可以结合 截取子字符串 ,比如input.substring(m.start(), m.end())得到匹配的文本。
2️⃣ 使用 matches() 和 lookingAt() 方法
功能:
matches():要求 整个输入字符串 匹配正则表达式lookingAt():只要求 从输入开头开始匹配,不需要覆盖整个字符串
示例:
java
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class MatchesLooking {
private static final String REGEX = "foo";
private static final String INPUT = "fooooooooooooooooo";
public static void main(String[] args) {
Pattern pattern = Pattern.compile(REGEX);
Matcher matcher = 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());
}
}
输出结果:
java
Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false
💡 说明:
lookingAt()返回true,因为输入字符串从开头就是"foo"开始。matches()返回false,因为整个字符串"foooooooooooooooo"并不等于"foo"。
✅ 总结:
start()/end()→ 精确定位匹配位置matches()→ 完全匹配整个输入lookingAt()→ 匹配输入开头部分即可
🔹 小技巧
\b边界匹配符可以避免匹配到单词的一部分start()/end()与group()搭配,可轻松获取匹配文本及位置lookingAt()很适合 前缀匹配 场景