公司动态

Java正则表达式详解:语法、API与实战技巧

📅 2026/7/18 8:05:07
Java正则表达式详解:语法、API与实战技巧
1. Java正则表达式基础概念正则表达式Regular Expression本质上是一种字符串匹配的模式描述语言。在Java中正则表达式通过java.util.regex包实现主要用于字符串的搜索、替换和验证操作。与传统的字符串操作方法相比正则表达式的优势在于能够用简洁的语法描述复杂的匹配规则。Java正则表达式的核心类有两个Pattern类表示编译后的正则表达式模式Matcher类用于对输入字符串进行匹配操作注意Java中的正则表达式字符串需要双重转义。例如匹配数字的\d在Java中要写成\\d这是因为Java字符串本身也会对反斜杠进行转义处理。2. 正则表达式语法详解2.1 基本元字符元字符说明示例.匹配任意单个字符a.c匹配abc\d匹配数字[0-9]\d\d匹配12\D匹配非数字\D\D匹配ab\w匹配单词字符[a-zA-Z0-9_]\w\w匹配a1\W匹配非单词字符\W\W匹配!\s匹配空白字符(空格\t\n\r\f)a\sb匹配a b2.2 量词限定符量词说明示例*0次或多次a*b匹配b,aab1次或多次ab匹配ab,aab?0次或1次a?b匹配b,ab{n}恰好n次a{2}b匹配aab{n,}至少n次a{2,}b匹配aab,aaab{n,m}n到m次a{2,4}b匹配aab,aaaab2.3 边界匹配边界符说明示例^行首^abc匹配abc123$行尾abc$匹配123abc\b单词边界\bcat\b匹配a cat\B非单词边界\Bcat\B匹配category3. Java正则API核心用法3.1 Pattern类常用方法// 编译正则表达式 Pattern pattern Pattern.compile(a*b); // 快速匹配(静态方法) boolean isMatch Pattern.matches(a*b, aaaaab); // 分割字符串 String[] parts pattern.split(aaabaaacaaaad);3.2 Matcher类核心方法Pattern p Pattern.compile(\\d); Matcher m p.matcher(abc123def456); // 查找匹配 while(m.find()) { System.out.println(找到数字: m.group()); } // 替换操作 String result m.replaceAll(#);4. 分组与捕获正则表达式中的圆括号()用于创建捕获组Pattern p Pattern.compile((\\d{3})-(\\d{4})); Matcher m p.matcher(123-4567); if(m.matches()) { System.out.println(区号: m.group(1)); // 123 System.out.println(号码: m.group(2)); // 4567 }特殊分组语法(?:pattern)非捕获分组(?pattern)正向预查(?!pattern)负向预查5. 常见使用场景与示例5.1 数据验证// 验证手机号 String regex ^1[3-9]\\d{9}$; boolean isValid 13812345678.matches(regex); // 验证邮箱 String emailRegex ^\\w([-.]\\w)*\\w([-.]\\w)*\\.\\w([-.]\\w)*$;5.2 文本提取String text 订单号ORD12345金额128.50; Pattern p Pattern.compile(ORD(\\d).*?(\\d\\.\\d{2})); Matcher m p.matcher(text); if(m.find()) { String orderNo m.group(1); // 12345 String amount m.group(2); // 128.50 }5.3 文本替换String text 用户1的电话是13800138000; String masked text.replaceAll((1[3-9])\\d{4}(\\d{4}), $1****$2); // 结果用户1的电话是138****80006. 性能优化与注意事项预编译Pattern频繁使用的正则表达式应该预编译为Pattern对象private static final Pattern PHONE_PATTERN Pattern.compile(^1[3-9]\\d{9}$);避免贪婪匹配在量词后加?变为非贪婪模式// 贪婪匹配 Pattern.compile(.*); // 匹配整个div.../div // 非贪婪匹配 Pattern.compile(.*?); // 匹配单个div注意回溯问题复杂的正则可能导致性能问题// 不好的写法容易引起回溯 Pattern.compile((a)b); // 改进写法 Pattern.compile(ab);特殊字符转义正则中的特殊字符需要转义// 匹配点号 String regex \\.;7. 实际开发中的经验技巧使用命名分组Java 7Pattern p Pattern.compile((?area\\d{3})-(?number\\d{4})); Matcher m p.matcher(123-4567); if(m.matches()) { String area m.group(area); String number m.group(number); }多行模式// 启用多行模式(^和$匹配行首行尾) Pattern p Pattern.compile(^\\d$, Pattern.MULTILINE);正则表达式调试使用在线工具测试正则表达式分解复杂正则为多个简单部分添加注释模式(Java 7)Pattern p Pattern.compile((?x) \\d{3} # 区号 \n - \\d{4} # 号码);常见问题排查检查是否忘记双重转义确认边界条件是否正确测试极端情况(空字符串、超长字符串等)8. 综合应用案例8.1 日志分析String log [2023-05-01 12:34:56] ERROR com.example.Service - 处理失败: 订单IDORD12345; Pattern p Pattern.compile( \\[(?datetime[^\\]])\\]\\s (?level\\w)\\s (?class[\\w.])\\s-\\s (?message.?)(?:\\s订单ID(?order\\w))? ); Matcher m p.matcher(log); if(m.matches()) { System.out.println(时间: m.group(datetime)); System.out.println(级别: m.group(level)); System.out.println(订单: m.group(order)); }8.2 HTML内容提取String html divp段落1/pp段落2/p/div; Pattern p Pattern.compile(p(.*?)/p); Matcher m p.matcher(html); while(m.find()) { System.out.println(找到段落: m.group(1)); }提示对于复杂的HTML解析建议使用专门的HTML解析库如Jsoup正则表达式适合简单的提取场景。9. 高级特性9.1 前后查找// 正向肯定预查 Pattern p1 Pattern.compile(Windows(?95|98|NT)); // 正向否定预查 Pattern p2 Pattern.compile(Windows(?!95|98|NT));9.2 非捕获分组// 匹配industry或industries但不捕获y/ies Pattern p Pattern.compile(industr(?:y|ies));9.3 反向引用// 匹配重复单词 Pattern p Pattern.compile(\\b(\\w)\\b\\s\\1\\b); Matcher m p.matcher(hello hello world); while(m.find()) { System.out.println(重复单词: m.group(1)); }10. 常见问题解决方案中文匹配// 匹配中文字符 Pattern p Pattern.compile([\\u4e00-\\u9fa5]);复杂日期验证// 验证YYYY-MM-DD格式日期 String regex ^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])- (?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])- (?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2} (?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468] [048]|[13579][26])00)-02-29)$;密码强度验证// 至少8位包含大小写字母和数字 String regex ^(?.*[a-z])(?.*[A-Z])(?.*\\d)[a-zA-Z\\d]{8,}$;URL提取String regex (https?|ftp|file)://[-A-Za-z0-9#/%?~_|!:,.;][-A-Za-z0-9#/%~_|];在实际开发中正则表达式虽然强大但也要注意不要过度使用。对于特别复杂的匹配逻辑考虑拆分为多个简单的正则表达式或者使用专门的解析器来处理。