Java正则匹配*(*007*)*失效,寻求技术建议
问题分析与解决方案
首先得说,你当前的正则表达式完全误解了需求里的符号含义,这才导致大量测试用例失败。咱们一步步理清楚:
你原来正则的核心问题
- 符号含义搞反:需求里的
*代表「任意内容」,但你写的\\*是在匹配字面的*字符,这完全偏离了需求。 - 多余的空格限制:你加了很多
\\s,强制要求括号、007的字符之间必须有空格,比如只能匹配* ( * 0 0 7 * ) *这种带空格的字符串,但实际需求里007是连续的,括号前后也不需要强制空格。 - 匹配范围错误:你的正则是在要求整个字符串完全符合某个固定结构,但需求是字符串包含指定模式,不是整个字符串等于这个模式。
正确的正则实现
根据你的需求——字符串包含「任意内容+(+任意内容+007+任意内容+)+任意内容」,核心是存在一对括号,括号内包含连续的007,前后可以有任意内容(包括空)。
基础版(不考虑换行)
用这个正则配合find()方法(检查字符串中是否存在匹配的子串)即可:
private static final Pattern PATTERN = Pattern.compile("\\(.*007.*\\)"); public static boolean matchesPattern(String input) { if (input == null) return false; return PATTERN.matcher(input).find(); }
\\(:匹配字面的左括号(括号是正则元字符,必须转义).*:匹配任意数量的任意字符(除了换行符),对应需求里的「任意内容」007:匹配连续的三个字符0、0、7\\):匹配字面的右括号
支持换行的版本
如果输入字符串可能包含换行符,需要加上DOTALL标志,让.能匹配换行:
private static final Pattern PATTERN = Pattern.compile("\\(.*007.*\\)", Pattern.DOTALL);
避免嵌套括号的进阶版(可选)
如果需求是最外层括号内包含007,不想匹配嵌套括号的情况(比如(a(b007c)d)这种),可以用非贪婪匹配+排除右括号的写法:
private static final Pattern PATTERN = Pattern.compile("\\([^)]*007[^)]*\\)");
这里[^)]*表示匹配任意数量的非右括号字符,确保只会匹配到最近的右括号,不会跨嵌套。
测试验证
以下测试用例都应该返回true:
abc(xyz007123)def(007)foo(bar)baz(qux007quux)xyz
内容的提问来源于stack exchange,提问作者Shamus
相关产品推荐
相关产品推荐

