Pattern 类是 Java 中正则表达式的核心类,它提供了对正则表达式的处理和操作。正则表达式(Regex)是用于描述字符模式的字符串,可以通过 Pattern 类和 Matcher 类来实现字符串的匹配、替换、分割等功能。

在这篇学习笔记中,我将详细介绍 Pattern 类的用法。

1. Pattern 类简介

Pattern 类属于 java.util.regex 包,它是 Java 提供的对正则表达式的支持的核心类。Pattern 用于编译正则表达式,创建一个模式,然后可以用这个模式在字符串中进行匹配。

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

主要方法

  • compile(String regex):将正则表达式字符串编译为 Pattern 对象。
  • matcher(CharSequence input):创建一个新的 Matcher 对象,用来对输入序列进行匹配。
  • split(CharSequence input):使用正则表达式对字符串进行拆分,返回一个字符串数组。

常用正则表达式符号

  • .:匹配任何单个字符(除了换行符)。
  • *:匹配零个或多个前面的字符。
  • +:匹配一个或多个前面的字符。
  • ?:匹配零个或一个前面的字符。
  • []:字符类,用来表示一个字符集合,表示集合中的任意字符。
  • ^:匹配输入的开始。
  • $:匹配输入的结束。
  • \d:匹配任何数字,等同于 [0-9]
  • \w:匹配任何字母数字字符,等同于 [a-zA-Z0-9_]
  • \s:匹配任何空白字符,包括空格、制表符、换页符等。
  • |:表示逻辑“或”,匹配左边或右边的表达式。

2. Pattern 类的使用

2.1 编译正则表达式

首先,我们需要使用 Pattern.compile() 方法来编译正则表达式字符串。

Pattern pattern = Pattern.compile("\\d+"); // 匹配一个或多个数字

这里的 \\d+ 正则表达式表示匹配一个或多个数字(\\d 代表数字,+ 代表一个或多个)。

2.2 使用 Matcher 进行匹配

Matcher 类提供了许多方法来使用正则表达式匹配输入字符串,常用的方法有:

  • find():查找字符串中是否有符合正则表达式的部分。
  • matches():判断整个字符串是否符合正则表达式。
  • group():返回与当前匹配成功的子串。
String input = "1234";
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(input);

if (matcher.matches()) {
    System.out.println("匹配成功!");
} else {
    System.out.println("匹配失败!");
}

输出:

匹配成功!

2.3 查找匹配项

find() 方法用于查找字符串中是否有符合正则表达式的部分。

String input = "I have 100 apples and 25 oranges";
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(input);

while (matcher.find()) {
    System.out.println("找到匹配项: " + matcher.group());
}

输出:

找到匹配项: 100
找到匹配项: 25

2.4 分组匹配

可以通过括号 () 来定义正则表达式的分组,并使用 group(int group) 方法获取对应分组的内容。

String input = "Name: John, Age: 30";
Pattern pattern = Pattern.compile("Name: (\\w+), Age: (\\d+)");
Matcher matcher = pattern.matcher(input);

if (matcher.find()) {
    System.out.println("姓名: " + matcher.group(1)); // group(1) 对应第一个括号里的内容
    System.out.println("年龄: " + matcher.group(2)); // group(2) 对应第二个括号里的内容
}

输出:

姓名: John
年龄: 30

2.5 替换字符串

replaceAll() 方法可以用来将字符串中符合正则表达式的部分替换成指定的字符串。

String input = "I have 100 apples and 25 oranges";
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(input);

String result = matcher.replaceAll("[数字]");
System.out.println(result);

输出:

I have [数字] apples and [数字] oranges

2.6 正则表达式分割字符串

split() 方法可以根据正则表达式分割字符串。

String input = "apple,banana,orange";
Pattern pattern = Pattern.compile(",");
String[] fruits = pattern.split(input);

for (String fruit : fruits) {
    System.out.println(fruit);
}

输出:

apple
banana
orange

2.7 匹配特殊字符

如果你需要匹配正则表达式中的特殊字符(如 .*+? 等),需要对这些字符进行转义。

String input = "abc.abc";
Pattern pattern = Pattern.compile("abc\\.abc"); // 转义 .
Matcher matcher = pattern.matcher(input);

if (matcher.matches()) {
    System.out.println("匹配成功!");
} else {
    System.out.println("匹配失败!");
}

输出:

匹配成功!

3. Pattern 类的一些注意事项

  • 正则表达式中需要转义的字符:在 Java 中,反斜杠 \ 是转义字符,所以在正则表达式中,如果要表示反斜杠本身,需要写成 \\
  • 贪婪与非贪婪匹配
    • 贪婪匹配会尽可能多地匹配字符。
    • 非贪婪匹配会尽量少地匹配字符,通常通过在量词后加上 ? 来实现(如 .*?)。

贪婪与非贪婪匹配示例:

String input = "<html><body>Content</body></html>";
Pattern pattern = Pattern.compile("<.*>");
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
    System.out.println("贪婪匹配: " + matcher.group()); // <html><body>Content</body></html>
}

pattern = Pattern.compile("<.*?>");
matcher = pattern.matcher(input);
if (matcher.find()) {
    System.out.println("非贪婪匹配: " + matcher.group()); // <html>
}

4. 小结

Pattern 类和 Matcher 类是 Java 中用于处理正则表达式的核心工具。通过 Pattern.compile() 方法,我们可以将正则表达式编译为一个 Pattern 对象,随后通过 Matcher 对象对字符串进行各种操作,如匹配、查找、替换、分割等。

掌握 Pattern 类和正则表达式,可以有效提高字符串处理的效率,帮助我们在实际开发中处理各种复杂的文本匹配问题。