Regex匹配问题求助:Pattern.matches始终返回false
问题解决:正则匹配返回false的原因及修正
核心问题
你使用的Pattern.matches()方法要求整个字符串完全匹配正则表达式,但你的目标只是检查字符串中是否包含*[数字]这类片段,因此直接调用该方法必然返回false——你的Description字段内容远不止目标匹配段。
另外,虽然你的正则(\\*\\[\\d+\\])能匹配*[151]片段,但受限于matches()的特性,只有当整个字符串和正则完全一致时才会返回true。
修正代码
改用Pattern.compile()配合Matcher.find()来检查字符串中是否存在目标匹配片段,这是更符合需求的写法:
Case ca = [Select Id, Description, Subject from Case Where Id='500DP00000HSWwnYAH']; Pattern p = Pattern.compile('\\*\\[\\d+\\]'); Matcher m = p.matcher(ca.Description); Boolean TestMatch = m.find(); system.debug('TEST Regex '+TestMatch);
如果一定要使用Pattern.matches(),可以给正则前后加上通配符,并开启DOTALL模式让.匹配换行符(覆盖Description中的换行和空格):
Boolean TestMatch = Pattern.matches('(?s).*\\*\\[\\d+\\].*', ca.Description);
额外优化
- 正则中的括号
()是分组语法,此处无需分组可以直接去掉,不影响匹配效果。 - 若需要提取
[]内的数字,可以给\\d+添加分组,通过group()方法获取:
Pattern p = Pattern.compile('\\*\\[(\\d+)\\]'); Matcher m = p.matcher(ca.Description); if(m.find()){ String targetNum = m.group(1); system.debug('提取的数字:'+targetNum); // 输出151 }
内容的提问来源于stack exchange,提问作者saheb shaikh
相关产品推荐
相关产品推荐

