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

文章目录

  • [451. Java 正则表达式 - Matcher 的 `start()`, `end()`, `matches()` 和 `lookingAt()`](#451. Java 正则表达式 - Matcher 的 start(), end(), matches()lookingAt())
    • [1️⃣ 使用 `start()` 和 `end()` 方法](#1️⃣ 使用 start()end() 方法)
      • 功能:
      • [示例:统计单词 `"dog"` 出现次数](#示例:统计单词 "dog" 出现次数)
    • [2️⃣ 使用 `matches()` 和 `lookingAt()` 方法](#2️⃣ 使用 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() → 匹配输入开头部分即可

🔹 小技巧

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