0Pricing
Java Academy · 课时

查找与匹配

matches、find、lookingAt

查找与匹配 是 CoddyKit 上的免费 Java Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

应用模式的三种方式

Matcher 提供三种核心测试:

  • matches() 要求整个输入都匹配。
  • lookingAt() 要求从开头开始匹配。
  • find() 会在任意位置搜索匹配项。
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("42");
        System.out.println(m.matches());
    }
}

matches:匹配整个输入

只有当整个字符串都符合模式时,matches 才会返回 true,效果就像在两端都加上了锚点。

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d+");
        System.out.println(p.matcher("123").matches());
        System.out.println(p.matcher("123abc").matches());
    }
}

lookingAt:从开头匹配

如果输入以匹配内容开头,lookingAt 就会成功,即使剩余部分不匹配也不受影响。

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d+");
        System.out.println(p.matcher("123abc").lookingAt());
        System.out.println(p.matcher("abc123").lookingAt());
    }
}

find:在任意位置匹配

find 会向前扫描以查找下一个匹配项。如果从当前位置开始或之后存在匹配项,它就会返回 true。

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d+");
        System.out.println(p.matcher("abc123def").find());
    }
}

使用 find 遍历所有匹配项

在循环中调用 find,可以遍历输入中的每一个匹配项。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("a1bb22ccc333");
        while (m.find()) {
            System.out.println(m.group());
        }
    }
}

匹配位置:start 和 end

成功匹配后,start() 和 end() 会给出索引范围,而 group() 会给出匹配到的文本。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("abc123");
        if (m.find()) {
            System.out.println(m.group() + " at [" + m.start() + "," + m.end() + ")");
        }
    }
}

使用 find 配合锚点

锚点 ^ 和 $ 可以让 find 实现类似开头或结尾检查的效果。这里的 ^\d+ 只会匹配最开头的数字。

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("^\\d+");
        System.out.println(p.matcher("123abc").find());
        System.out.println(p.matcher("abc123").find());
    }
}

重置 Matcher

reset() 会将匹配器倒回开头,这样您就可以再次扫描同一个输入。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("a").matcher("aaa");
        int first = 0;
        while (m.find()) first++;
        m.reset();
        int second = 0;
        while (m.find()) second++;
        System.out.println(first + " " + second);
    }
}

在新输入上复用 Matcher

reset(newInput) 会让同一个匹配器对象处理另一个字符串,从而避免重新分配对象。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("abc");
        m.reset("xyz789");
        System.out.println(m.find());
        System.out.println(m.group());
    }
}

matches 与 find 总结

请根据意图进行选择:使用 matches 验证完整值(例如完整的 ID),使用 find 从较大的文本中提取或定位其中的部分内容。

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern id = Pattern.compile("[A-Z]{2}\\d{4}");
        System.out.println(id.matcher("AB1234").matches());
        System.out.println(id.matcher("id=AB1234;").find());
    }
}

统计匹配项数量

统计出现次数是一个常见任务。循环调用 find,并递增计数器。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("o").matcher("foo boo zoo");
        int count = 0;
        while (m.find()) count++;
        System.out.println(count);
    }
}

快速检查

哪种方法要求整个输入字符串都匹配模式?

回顾

您已经学习了如何定位匹配项:

  • matches 测试整个输入;lookingAt 测试开头;find 在任意位置搜索。
  • 循环调用 find 以遍历所有匹配项,并读取 group、start 和 end。
  • reset 会倒回开头,而 reset(input) 会让匹配器复用于新的文本。

常见问题解答

「查找与匹配」课时是免费的吗?

是的 — 「查找与匹配」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「查找与匹配」这节课中我会学到什么?

matches、find、lookingAt 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「查找与匹配」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 编译正则表达式
  2. 查找与匹配
  3. 捕获组
  4. 使用正则替换
← 返回 Java Academy