编译正则表达式
Pattern.compile 与 Matcher
编译正则表达式 是 CoddyKit 上的免费 Java Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
Pattern 与 Matcher 的组合
Java 正则表达式位于 java.util.regex 中。Pattern 是编译后的正则表达式;Matcher 会将该模式应用于特定输入。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("abc123");
System.out.println(m.find());
}
}编译一次,反复复用
Pattern.compile 的开销相对较大。请只编译一次模式,并在多个输入之间复用它,而不要在循环中反复编译。
import java.util.regex.Pattern;
public class Main {
static final Pattern DIGITS = Pattern.compile("\\d+");
public static void main(String[] args) {
System.out.println(DIGITS.matcher("a1").find());
System.out.println(DIGITS.matcher("bb").find());
}
}在 Java 中转义反斜杠
像 \d 这样的正则表达式标记需要反斜杠,但 Java 字符串也使用反斜杠表示转义。因此,在源代码中应写成 \\d,表示正则表达式中的 \d。
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Pattern word = Pattern.compile("\\w+");
System.out.println(word.matcher("hello").matches());
}
}创建 Matcher
pattern.matcher(input) 会将模式绑定到一个输入字符串,并返回一个跟踪当前位置的新 Matcher。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("the cat sat");
System.out.println(m.find());
}
}Matcher 具有状态
Matcher 保存可变状态(当前位置和上一次匹配)。请为每个输入创建一个新的匹配器;不要在线程之间共享同一个匹配器。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d");
Matcher m = p.matcher("a1b2");
System.out.println(m.find());
System.out.println(m.find());
}
}忽略大小写标志
将标志作为第二个参数传递给 compile。Pattern.CASE_INSENSITIVE 会忽略字母大小写。
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
System.out.println(p.matcher("I love JAVA").find());
}
}组合多个标志
使用按位 OR 运算符组合标志。这里加入 MULTILINE,使锚点可以在每一行进行匹配。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("^a", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
Matcher m = p.matcher("apple\nApricot");
int count = 0;
while (m.find()) count++;
System.out.println(count);
}
}静态 matches 快捷方式
Pattern.matches(regex, input) 是一种一次性辅助方法,可以在一次调用中完成编译和测试。它使用方便,但每次调用都会重新编译。
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
System.out.println(Pattern.matches("\\d{3}", "123"));
System.out.println(Pattern.matches("\\d{3}", "12"));
}
}使用 Pattern 进行拆分
已编译的 Pattern 可以通过 split 拆分字符串,从而高效地复用同一个已编译的正则表达式。
import java.util.Arrays;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Pattern comma = Pattern.compile("\\s*,\\s*");
String[] parts = comma.split("a, b ,c, d");
System.out.println(Arrays.toString(parts));
}
}检查模式
pattern() 返回原始正则表达式字符串,flags() 则以 int 返回当前启用的标志。
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);
System.out.println(p.pattern());
System.out.println(p.flags());
}
}无效模式会抛出异常
格式错误的正则表达式会在 compile 时抛出 PatternSyntaxException,这样您就能及早捕获错误。
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class Main {
public static void main(String[] args) {
try {
Pattern.compile("[unclosed");
} catch (PatternSyntaxException e) {
System.out.println("Invalid regex");
}
}
}快速检查
为什么应该将频繁使用的正则表达式编译为静态 Pattern 字段?
回顾
您已经学习了模式的编译:
Pattern.compile会构建一个可复用、不可变且线程安全的模式;matcher会将它绑定到输入。- 在 Java 源代码中,应将正则表达式中的反斜杠转义为
\\。 CASE_INSENSITIVE和MULTILINE等标志可以使用按位 OR 进行组合。Matcher具有状态,因此请为每个输入创建一个匹配器。
常见问题解答
「编译正则表达式」课时是免费的吗?
是的 — 「编译正则表达式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「编译正则表达式」这节课中我会学到什么?
Pattern.compile 与 Matcher 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「编译正则表达式」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。