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() |
返回模式的字符串表示 |
点我分享笔记