查找与匹配
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 反馈 — 无需本地设置。