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

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


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

功能:

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

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

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());
        }
    }
}

输出结果:

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():只要求 从输入开头开始匹配,不需要覆盖整个字符串

示例:

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());
    }
}

输出结果:

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false

💡 说明

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

总结

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

🔹 小技巧

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

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐