You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java正则匹配*(*007*)*失效,寻求技术建议

问题分析与解决方案

首先得说,你当前的正则表达式完全误解了需求里的符号含义,这才导致大量测试用例失败。咱们一步步理清楚:

你原来正则的核心问题

  1. 符号含义搞反:需求里的*代表「任意内容」,但你写的\\*是在匹配字面的*字符,这完全偏离了需求。
  2. 多余的空格限制:你加了很多\\s,强制要求括号、007的字符之间必须有空格,比如只能匹配* ( * 0 0 7 * ) *这种带空格的字符串,但实际需求里007是连续的,括号前后也不需要强制空格。
  3. 匹配范围错误:你的正则是在要求整个字符串完全符合某个固定结构,但需求是字符串包含指定模式,不是整个字符串等于这个模式。

正确的正则实现

根据你的需求——字符串包含「任意内容+(+任意内容+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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:32:26