Java正则匹配与提取

正则表达式(Regular Expression)是一种强大的文本匹配工具,可以在字符串中查找特定的模式。在Java中,通过正则表达式可以进行字符串的匹配、提取和替换等操作。本文将介绍Java中如何使用正则表达式进行匹配和提取,并通过代码示例详细说明。

正则表达式基础

正则表达式由字符和特殊符号组成,用来定义一个字符串的模式。以下是一些常见的正则表达式元字符:

  • .:匹配任意字符(除了换行符)
  • *:匹配前一个字符0次或多次
  • +:匹配前一个字符1次或多次
  • ?:匹配前一个字符0次或1次
  • |:匹配多个模式中的一个
  • [...]:匹配方括号中的任意字符
  • [^...]:匹配除了方括号中字符以外的任意字符
  • ^:匹配字符串的开头
  • $:匹配字符串的结尾
  • \d:匹配任意数字
  • \D:匹配任意非数字字符
  • \w:匹配任意字母、数字或下划线
  • \W:匹配任意非字母、数字或下划线字符
  • \s:匹配任意空白字符
  • \S:匹配任意非空白字符

使用Pattern和Matcher类进行匹配和提取

在Java中,可以使用PatternMatcher类来进行正则表达式的匹配和提取。

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

public class RegexExample {
    public static void main(String[] args) {
        String input = "Hello, my email is example@example.com";

        // 匹配邮箱地址
        String patternString = "\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b";
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(input);

        // 查找并输出匹配到的邮箱地址
        while (matcher.find()) {
            System.out.println("Email found: " + matcher.group());
        }
    }
}

上述代码中,首先定义了一个字符串input,其中包含一个邮箱地址。然后,使用Pattern.compile()方法将正则表达式编译为一个Pattern对象。接下来,通过Pattern.matcher()方法将要匹配的字符串传入,返回一个Matcher对象。最后,使用Matcher.find()方法循环查找匹配到的字符串,并使用Matcher.group()方法获取匹配到的字符串。

运行上述代码,输出结果如下:

Email found: example@example.com

提取匹配的内容

除了查找匹配的字符串,还可以提取正则表达式中定义的分组内容。

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

public class RegexExample {
    public static void main(String[] args) {
        String input = "My phone number is (123) 456-7890";

        // 提取电话号码的区号和号码部分
        String patternString = "\\((\\d{3})\\) (\\d{3}-\\d{4})";
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(input);

        // 提取并输出区号和号码部分
        if (matcher.find()) {
            String areaCode = matcher.group(1);
            String phoneNumber = matcher.group(2);
            System.out.println("Area code: " + areaCode);
            System.out.println("Phone number: " + phoneNumber);
        }
    }
}

上述代码中,定义了一个字符串input,其中包含一个电话号码。然后,使用Pattern.compile()方法将正则表达式编译为一个Pattern对象,并使用Pattern.matcher()方法创建一个Matcher对象。接下来,使用Matcher.find()方法查找匹配的字符串。如果找到了匹配的字符串,可以通过Matcher.group()方法提取分组内容,并分别赋值给areaCodephoneNumber变量。

运行上述代码,输出结果如下:

Area code: 123
Phone number: 456-7890