正则表达式作为文本处理的利器,在Java开发中扮演着重要角色。本文将带你系统学习Java正则表达式的核心知识,并通过大量实战案例展示其强大功能。
一、Java正则表达式基础
Java通过java.util.regex包提供正则表达式支持,主要包含Pattern和Matcher两个核心类。Pattern表示编译后的正则表达式,Matcher则负责对输入字符串进行匹配操作。
1.1 基本语法
Java正则表达式语法与其他语言基本一致,但有一些特殊注意事项:
- 特殊字符需要双重转义,如匹配数字应写作\d
- 预定义字符类:\d(数字)、\w(单词字符)、\s(空白字符)
- 量词:*(0次或多次)、+(1次或多次)、?(0次或1次)、{n}(恰好n次)
1.2 常用匹配方法
String类提供了几个便捷的正则方法:
- matches(): 整个字符串是否匹配
- split(): 按正则分割字符串
- replaceAll(): 正则替换
二、Pattern与Matcher深入
对于复杂操作,需要直接使用Pattern和Matcher类:
Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
Matcher matcher = pattern.matcher("2023-05-20");
boolean isMatch = matcher.matches();
2.1 分组捕获
使用圆括号创建捕获组,可通过group()方法获取:
Pattern p = Pattern.compile("(\\d{3})-(\\d{4})");
Matcher m = p.matcher("123-4567");
if(m.find()) {
System.out.println(m.group(1)); // 输出123
System.out.println(m.group(2)); // 输出4567
}
三、高级特性与应用
3.1 非贪婪匹配
默认量词是贪婪的,添加?可改为非贪婪模式:
// 贪婪匹配
Pattern.compile("a.*b").matcher("aabab").find(); // 匹配整个字符串
// 非贪婪匹配
Pattern.compile("a.*?b").matcher("aabab").find(); // 只匹配aab
3.2 零宽断言
包括正向预查(?=)、负向预查(?!)等,用于匹配位置而非字符:
// 匹配后面跟着_的数字
Pattern.compile("\\d(?=_)").matcher("1_2_3").find(); // 匹配1和2
四、性能优化建议
- 预编译Pattern对象并重用
- 避免过度使用回溯
- 考虑使用StringBuilder处理复杂替换
- 对复杂正则进行分解
五、实战案例
5.1 邮箱验证
String emailRegex = "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$";
boolean isValid = "[email protected]".matches(emailRegex);
5.2 提取HTML链接
Pattern linkPattern = Pattern.compile("<a\\s+href=\\"(.*?)\\".*?>(.*?)</a>");
Matcher matcher = linkPattern.matcher(htmlContent);
while(matcher.find()) {
System.out.println("URL: " + matcher.group(1));
System.out.println("Text: " + matcher.group(2));
}
六、常见问题排查
- 特殊字符未正确转义
- 未考虑多行模式(使用Pattern.MULTILINE)
- 贪婪匹配导致意外结果
- 性能问题(如灾难性回溯)
通过系统学习和大量实践,你将能够熟练运用Java正则表达式解决各种文本处理难题。记住,复杂的正则表达式虽然强大,但可读性会降低,必要时可以考虑分步处理或添加详细注释。
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。