正则表达式匹配解释与空格/非数字/字边界

时间:2015-10-05 15:20:45

标签: java regex string

我们有以下代码

getKeyFrame

我们的假设是它应该匹配ABC和2015与周围的单词边界(不消耗字符),w +字符匹配子字符串本身,然后是非数字\ D表示空白。 ABC1不应该匹配,因为

后面没有空格

结果打印输出

String str = "ABC 2015 ABC1";
Pattern pattern = Pattern.compile("\\b\\w+\\D\\b");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
  System.out.println(">" + matcher.group() + "<");
}

似乎证实了这一点,但是稍微改变str会开始怀疑上述匹配解释是否正确。 E.g。

  • 将其修改为&#34; ABC 2015 ABC1&#34;尾随空格似乎产生相同的结果,与&gt; ABC1&lt;

  • 不匹配
  • 将其修改为&#34; ABC&#34;没有尾随空格会产生&gt; ABC&lt;似乎表明\ D现在可能匹配&#39; C&#39;因此w +不会贪婪地消耗所有字母字符

  • 将其修改为&#34; ABC&#34;尾随空格产生&gt; ABC&lt;再次,进一步混淆情况

如果有人可以解释什么是正确的解释,将不胜感激

2 个答案:

答案 0 :(得分:2)

  

然后是空白的非数字\ D.

但是在空格和下一个字符之间不存在单词边界。

你的正则表达式必须是,

"\\b\\w+(?=\\s)"

答案 1 :(得分:1)

我认为你的困惑源于误解\b - 字边界。

\b零长度匹配,它将匹配单词\w+的任何开头或结尾。

在我们的例子中,由于"ABC 2015 ABC1",字符串\D显然不匹配。

通过添加空格,您可以为正则表达式\\b\\w+\\D的以下部分创建一个很好的匹配 - &gt; "ABC1 "但现在单词边界将不匹配,因为在空格之后没有任何单词的开头/结尾。

如果您将字符串修改为:"ABC 2015 ABC1 x",它将“修复”该问题,因为额外的新字符将提供匹配,因为它前面的(零长度)字边界。 / p>

Avinash写了一个正确的答案,也解释了这个问题 - 但你不理解它(再次阅读他的答案的前两行),我认为他的答案应该被接受(+1来自我)。