我们有以下代码
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;再次,进一步混淆情况
如果有人可以解释什么是正确的解释,将不胜感激
答案 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来自我)。