JDK1.8环境下Java正则Matcher.find()匹配结果异常问题咨询
问题根源
- 量词使用不符合预期:你写的
[a-zA-Z]*中*的含义是匹配0次及以上的字母,你预期要求「至少1个字母」,应该将*替换为+,修正后的正则为([a-zA-Z]+), ([a-zA-Z]+)。 find()方法的特性导致部分匹配:Matcher.find()不需要匹配整个输入字符串,只要在字符串中找到任意一段符合规则的子串就会返回true。你输入Bond, 007时,Bond,后的位置刚好可以匹配0个字母,所以原正则匹配到了Bond,这段子串,第二个分组自然返回空字符串。
修复方案
如果要验证整串完全符合你的规则,二选一即可:
- 保留
find()调用,给正则加上首尾边界限制:^([a-zA-Z]+), ([a-zA-Z]+)$,^代表字符串起始位置,$代表字符串结束位置,避免部分匹配 - 直接将代码中的
mch.find()替换为mch.matches(),matches()方法默认要求正则匹配整个输入字符串,不需要额外加边界符
内容的提问来源于stack exchange,提问作者Aging Hacker
相关产品推荐
相关产品推荐

