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");
// 编译正则表达式
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 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();
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"
}
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]"
Pattern phonePattern = Pattern.compile("\\d{3}-\\d{3}-\\d{4}");
String output = phonePattern.matcher(input).replaceAll("[PHONE]");
// 输出: "Hello, my phone is [PHONE]"
性能优化建议
- 预编译正则表达式:对于需要多次使用的正则表达式,应该预先编译成 - Pattern对象,而不是每次使用时重新编译。
- 避免过度复杂的正则表达式:过于复杂的正则表达式可能会导致性能下降,甚至出现"灾难性回溯"问题。 
- 合理使用分组:非捕获分组 - (?:...)比捕获分组- (...)性能更好,如果不需要捕获内容,应该使用非捕获分组。
总结
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() | 返回模式的字符串表示 | 
