Java Pattern 类

Java 中的 Pattern 类是正则表达式功能的核心组件之一,它属于 java.util.regex 包。

正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找、替换字符串中的特定模式。

Pattern 类的主要作用是将正则表达式编译成一个模式(Pattern),以便后续进行高效的匹配操作。


正则表达式简介

正则表达式是一种用于描述字符串模式的语法。通过特定的符号和规则,可以定义复杂的字符串匹配规则。例如:

  • \d 匹配任意数字(等价于 [0-9]
  • \w 匹配任意字母、数字或下划线(等价于 [a-zA-Z0-9_]
  • a+ 匹配一个或多个连续的字母 a
  • ^ 匹配字符串的开头
  • $ 匹配字符串的结尾

Pattern 类的基本使用

创建 Pattern 对象

Pattern 类没有公共构造方法,必须通过静态方法 compile() 来创建实例:

实例

import java.util.regex.Pattern;

// 编译正则表达式
Pattern pattern = Pattern.compile("a*b");

常用方法

matcher(CharSequence input)

创建一个 Matcher 对象,用于对输入字符串进行匹配操作:

实例

Matcher matcher = pattern.matcher("aaaab");

matches(String regex, CharSequence input)

静态方法,直接判断输入字符串是否完全匹配正则表达式:

实例

boolean isMatch = Pattern.matches("a*b", "aaaab"); // 返回 true

split(CharSequence input)

根据正则表达式拆分输入字符串:

实例

String[] parts = pattern.split("aaaabtest"); // 返回 ["", "test"]

正则表达式标志(Flags)

在编译正则表达式时,可以指定不同的标志来改变匹配行为:

标志 说明
Pattern.CASE_INSENSITIVE 忽略大小写
Pattern.MULTILINE 多行模式,^$ 匹配每行的开头和结尾
Pattern.DOTALL . 匹配所有字符,包括换行符
Pattern.UNICODE_CASE 启用 Unicode 感知的大小写折叠

使用示例:

实例

// 忽略大小写匹配
Pattern pattern = Pattern.compile("a*b", Pattern.CASE_INSENSITIVE);

Pattern 类的实际应用

验证邮箱格式

实例

String emailRegex = "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$";
Pattern emailPattern = Pattern.compile(emailRegex);

String email = "test@example.com";
boolean isValid = emailPattern.matcher(email).matches();

提取数字

实例

String text = "Price: $123.45";
Pattern numberPattern = Pattern.compile("\\d+\\.?\\d*");
Matcher matcher = numberPattern.matcher(text);

if (matcher.find()) {
    String number = matcher.group(); // "123.45"
}

替换字符串

实例

String input = "Hello, my phone is 123-456-7890";
Pattern phonePattern = Pattern.compile("\\d{3}-\\d{3}-\\d{4}");
String output = phonePattern.matcher(input).replaceAll("[PHONE]");
// 输出: "Hello, my phone is [PHONE]"

性能优化建议

  1. 预编译正则表达式:对于需要多次使用的正则表达式,应该预先编译成 Pattern 对象,而不是每次使用时重新编译。

  2. 避免过度复杂的正则表达式:过于复杂的正则表达式可能会导致性能下降,甚至出现"灾难性回溯"问题。

  3. 合理使用分组:非捕获分组 (?:...) 比捕获分组 (...) 性能更好,如果不需要捕获内容,应该使用非捕获分组。


总结

Pattern 类是 Java 正则表达式功能的核心,它提供了强大的字符串模式匹配能力。通过合理使用 Pattern 类及其配套的 Matcher 类,可以高效地完成各种字符串处理任务。掌握正则表达式和 Pattern 类的使用,将大大提升开发者的文本处理能力。

下表列出了 Pattern 类的常用方法:

构造与编译方法

方法 描述
static Pattern compile(String regex) 将正则表达式编译为 Pattern 对象
static Pattern compile(String regex, int flags) 用指定标志编译正则表达式
static boolean matches(String regex, CharSequence input) 快速匹配正则表达式(编译+匹配)
static String quote(String s) 将字符串转换为字面量模式(转义所有特殊字符)

标志常量(常用)

标志 描述
Pattern.CASE_INSENSITIVE 不区分大小写匹配
Pattern.MULTILINE 多行模式(^和$匹配行首行尾)
Pattern.DOTALL 点号(.)匹配所有字符包括行终止符
Pattern.UNICODE_CASE 启用Unicode感知的大小写折叠

匹配与分割方法

方法 描述
Matcher matcher(CharSequence input) 创建匹配器对象
String[] split(CharSequence input) 用模式分割输入字符串
String[] split(CharSequence input, int limit) 带限制次数的分割
Stream<String> splitAsStream(CharSequence input) 返回分割后的流(Java 8+)

模式信息方法

方法 描述
String pattern() 返回编译的正则表达式
int flags() 返回编译时设置的标志
String toString() 返回模式的字符串表示