Skip to content

Java 正则表达式

正则表达式(Regular Expression, Regex)是一个强大的字符串处理工具,它是一个特殊的字符序列,用于定义搜索模式。在 Java 中,处理正则表达式的核心功能位于 java.util.regex 包中。

什么是正则表达式?

正则表达式可以用来:

  • 验证:检查一个字符串是否符合某种格式(如邮箱、手机号)。
  • 查找:在一段文本中寻找所有匹配特定模式的子字符串。
  • 替换:找到匹配的子字符串并将其替换为其他内容。
  • 分割:根据模式来分割字符串。

java.util.regex 包的核心类

  1. Pattern: 代表一个编译后的正则表达式。一个 Pattern 对象本身没有公共构造方法,需要通过其静态方法 Pattern.compile() 来创建。
  2. Matcher: 是一个正则表达式的匹配器引擎。它通过解释 Pattern 对输入的字符串执行匹配操作。Matcher 对象是通过 pattern.matcher(inputString) 方法获得的。

基本匹配流程

使用正则表达式通常遵循以下三步:

  1. 使用 Pattern.compile(regex) 创建一个 Pattern 对象。
  2. 使用 pattern.matcher(input) 创建一个 Matcher 对象。
  3. 使用 Matcher 对象的方法(如 find(), matches())来执行匹配。
java
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExample {
    public static void main(String[] args) {
        String text = "The quick brown fox jumps over the lazy dog.";
        String regex = "\\b[a-zA-Z]{3}\\b"; // 匹配所有长度为 3 的单词

        // 1. 编译正则表达式
        Pattern pattern = Pattern.compile(regex);

        // 2. 创建匹配器
        Matcher matcher = pattern.matcher(text);

        // 3. 查找匹配项
        System.out.println("在文本中找到所有3个字母的单词:");
        while (matcher.find()) {
            // find() 尝试寻找下一个匹配项
            // group() 返回当前找到的匹配子串
            System.out.println("找到: '" + matcher.group() + "' at index " + matcher.start());
        }
    }
}
// 输出:
// 找到: 'The' at index 0
// 找到: 'fox' at index 16
// 找到: 'the' at index 31
// 找到: 'dog' at index 40

注意: 在 Java 字符串中,反斜杠 \ 是一个转义字符,所以为了在正则表达式中使用一个 \,你需要在字符串中写入 \\

Matcher 类的常用方法

  • matches(): 尝试将整个输入字符串与模式进行匹配。只有整个字符串完全匹配时才返回 true
  • find(): 尝试查找输入字符串中与模式匹配的下一个子序列。每次调用都会从上一次匹配结束的位置继续搜索。
  • lookingAt(): 尝试从输入字符串的开头开始匹配模式。如果开头部分匹配,则返回 true,不要求整个字符串都匹配。
  • group(): 返回由上一次匹配操作(如 find())捕获的子字符串。
  • start() / end(): 返回上一次匹配的子字符串的起始索引和结束索引(不含)。
  • replaceAll(replacement): 替换所有匹配的子字符串。

String 类中的正则表达式方法

为了方便使用,String 类也内置了一些直接支持正则表达式的方法。

  • boolean matches(String regex): 判断整个字符串是否匹配给定的正则表达式。等效于 Pattern.matches(regex, this)

    java
    String email = "test@example.com";
    // 一个简单的邮箱格式验证
    boolean isValid = email.matches("^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$");
    System.out.println("邮箱格式是否有效: " + isValid); // true
  • String[] split(String regex): 根据正则表达式来分割字符串。

    java
    String text = "apple, banana; orange";
    String[] fruits = text.split("[,;\\s]+"); // 按逗号、分号或空白字符分割
    // fruits -> ["apple", "banana", "orange"]
  • String replaceAll(String regex, String replacement): 将所有匹配正则表达式的子字符串替换为指定的字符串。

    java
    String text = "My phone number is 123-456-7890.";
    // 将所有数字替换为 'X'
    String censored = text.replaceAll("\\d", "X");
    // censored -> "My phone number is XXX-XXX-XXXX."

常见正则表达式元字符

元字符描述
.匹配除换行符以外的任何单个字符
\d匹配一个数字,等同于 [0-9]
\D匹配一个非数字字符
\s匹配任何空白字符(空格、制表符、换行符等)
\S匹配任何非空白字符
\w匹配任何单词字符(字母、数字、下划线),等同于 [a-zA-Z_0-9]
\W匹配任何非单词字符
\b匹配单词边界
^匹配输入的开头
$匹配输入的结尾
*匹配前面的元素零次或多次
+匹配前面的元素一次或多次
?匹配前面的元素零次或一次
{n}匹配前面的元素恰好 n 次
{n,}匹配前面的元素至少 n 次
{n,m}匹配前面的元素至少 n 次,但不超过 m 次
[]字符集,匹配方括号中的任意一个字符。例如 [abc] 匹配 'a', 'b', 或 'c'
()分组,将多个字符作为一个单元,并用于捕获匹配
``

本站内容仅供学习和研究使用。