正则表达式是Java开发中处理字符串匹配、查找、替换和验证的强大工具。掌握其核心类库与高级技巧,能显著提升代码效率与可维护性。本文将深入解析Java正则表达式的应用精髓。
Java通过java.util.regex.Pattern和java.util.regex.Matcher类提供正则支持。编译后的Pattern对象可复用,提升性能。
// 示例:编译Pattern并创建Matcher
Pattern pattern = Pattern.compile("\\d{3}-\\d{2}-\\d{4}");
Matcher matcher = pattern.matcher("123-45-6789");
boolean isMatch = matcher.matches(); // 返回true
Java字符串中的反斜杠需转义,因此正则中的\d在代码中需写作\\d。
[abc]匹配a、b或c;[^abc]匹配非a/b/c字符。\\d(数字),\\w(单词字符),\\s(空白字符)。?(0或1次),*(0次以上),+(1次以上),{n,m}(n到m次)。使用圆括号()分组,通过matcher.group(int)提取。
Pattern p = Pattern.compile("(\\d{3})-(\\d{2})-(\\d{4})");
Matcher m = p.matcher("123-45-6789");
if (m.find()) {
System.out.println(m.group(1)); // 输出:123
}
默认量词为贪婪模式,添加?可转为非贪婪(懒惰)模式。
// 贪婪匹配
Pattern.compile("<.*>").matcher("").find(); // 匹配整个字符串
// 非贪婪匹配
Pattern.compile("<.*?>").matcher("").find(); // 仅匹配
3. 边界匹配与前瞻后顾
^和$匹配字符串起止,\\b匹配单词边界。使用零宽断言实现复杂条件。
// 匹配后跟逗号的数字
Pattern.compile("\\d+(?=,)").matcher("123,456,789").find(); // 匹配123和456
4. 性能优化建议
- 预编译Pattern:避免在循环中重复编译正则表达式。
- 避免过度使用回溯:复杂嵌套量词可能导致性能下降,尽量使用具体字符类。
- 使用
String方法替代简单场景:如startsWith()、contains()等。
四、常见应用场景
- 数据验证:邮箱、手机号、身份证格式校验。
- 文本提取:从日志或HTML中抽取特定数据。
- 字符串替换与分割:使用
replaceAll()、split()方法。
// 替换所有数字为*
String result = "User123".replaceAll("\\d", "*"); // 返回User***
五、调试与测试工具推荐
开发时可利用在线正则测试工具(如regex101.com)验证表达式,并结合Java单元测试(JUnit)确保匹配准确性。
总结:Java正则表达式功能强大,熟练掌握Pattern与Matcher类、理解转义规则、应用分组与非贪婪匹配等技巧,能高效解决字符串处理难题。合理优化正则性能,可提升应用整体效率。