在 Java 里使用正则(java.util.regex),“更高效”通常体现在 避免重复编译、减少回溯、合理使用 API 这几个方面。下面按实用程度给你总结。
❌ 错误写法(每次都编译,极慢):
for (String s : list) {
if (s.matches("\\d+")) { ... }
}
String.matches 内部每次都会 Pattern.compile
✅ 正确写法:
Pattern pattern = Pattern.compile("\\d+");
for (String s : list) {
if (pattern.matcher(s).matches()) { ... }
}
✅ 如果是静态规则,用 static final:
private static final Pattern NUM = Pattern.compile("\\d+");
Matcher 的合适方法| 场景 | 推荐方法 |
|---|---|
| 完全匹配 | matcher.matches() |
| 包含匹配 | matcher.find() |
| 仅判断是否包含 | matcher.find() |
| 替换 | matcher.replaceAll() |
⚠️ 不要用 matches() 去判断“是否包含”
❌ 慢:
(.*).*(abc)
✅ 更快:
[^x]*abc
(?:abc|def)
比
(abc|def)
更快(不保存分组)
❌
.*@.*
✅
[^@]+@[^@]+
Pattern pattern = Pattern.compile("a+");
Matcher matcher = pattern.matcher("");
for (String s : list) {
matcher.reset(s);
if (matcher.find()) { ... }
}
比每次 pattern.matcher(s) 稍快。
Pattern.compile("abc", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
⚠️ 不要无脑加 UNICODE_CASE,会影响性能。
如果:
考虑:
indexOf / regionjavalex, antlr)✅ 必做:
Pattern.compile 只做一次static finalmatches / find✅ 优化:
❌ 避免:
String.matches 在循环里.+ / .*如果你愿意,可以:
我可以直接帮你改成“更高效版本”。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。