0Pricing
Java Academy · 课时

编译正则表达式

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 反馈 — 无需本地设置。

此课程中的所有课时

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