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

Java 带空格/非数字/字边界的正则表达式匹配解释,java,regex,string,Java,Regex,String,我们有以下代码 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() + "<"); } String str=“ABC 2015 ABC1”; Pattern

我们有以下代码

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() + "<");
}
String str=“ABC 2015 ABC1”;
Pattern=Pattern.compile(“\\b\\w+\\D\\b”);
Matcher-Matcher=pattern.Matcher(str);
while(matcher.find()){
System.out.println(“>”+matcher.group()+”
然后非数字\D表示空白

但是在空白和下一个字符之间没有单词边界

你的正则表达式必须是

"\\b\\w+(?=\\s)"
然后非数字\D表示空白

但是在空白和下一个字符之间没有单词边界

你的正则表达式必须是

"\\b\\w+(?=\\s)"
然后非数字\D表示空白

但是在空白和下一个字符之间没有单词边界

你的正则表达式必须是

"\\b\\w+(?=\\s)"
然后非数字\D表示空白

但是在空白和下一个字符之间没有单词边界

你的正则表达式必须是

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

我认为你的困惑源于对单词边界的误解

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

在我们的例子中,字符串
“ABC 2015 ABC1”
显然不匹配,因为
\D

通过添加空格,您可以为正则表达式的以下部分创建一个很好的匹配项
\\b\\w+\\D
-->“ABC1”
,但现在单词边界将不匹配,因为空格后没有单词的任何开始/结束

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


阿维纳什写了一个正确的答案,也解释了这个问题——但你不明白(再次阅读他的答案的前两行),我认为他的答案应该被接受(+1来自我)。

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

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

在我们的例子中,字符串
“ABC 2015 ABC1”
显然不匹配,因为
\D

通过添加空格,您可以为正则表达式的以下部分创建一个很好的匹配项
\\b\\w+\\D
-->“ABC1”,但现在单词边界将不匹配,因为空格后没有单词的任何开始/结束

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


阿维纳什写了一个正确的答案,也解释了这个问题——但你不明白(再次阅读他的答案的前两行),我认为他的答案应该被接受(+1来自我)。

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

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

在我们的例子中,字符串
“ABC 2015 ABC1”
显然不匹配,因为
\D

通过添加空格,您可以为正则表达式的以下部分创建一个很好的匹配项
\\b\\w+\\D
-->“ABC1”,但现在单词边界将不匹配,因为空格后没有单词的任何开始/结束

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


阿维纳什写了一个正确的答案,也解释了这个问题——但你不明白(再次阅读他的答案的前两行),我认为他的答案应该被接受(+1来自我)。

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

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

在我们的例子中,字符串
“ABC 2015 ABC1”
显然不匹配,因为
\D

通过添加空格,您可以为正则表达式的以下部分创建一个很好的匹配项
\\b\\w+\\D
-->“ABC1”,但现在单词边界将不匹配,因为空格后没有单词的任何开始/结束

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


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

谢谢,但问题是如何解释上述匹配,而不是如何修改它你的意思是
“\\b\\w+(?=\\D)“
谢谢,但问题是如何解释上述匹配,而不是如何修改它您的意思是这
”\\b\\w+(?=\\D)”
谢谢,但问题是如何解释上述匹配,而不是如何修改它您的意思是\\b\\w+(?=\\D)”谢谢,但问题是如何解释上述匹配,而不是如何修改它您的意思是
“\\b\\w+(?=\\D)”
话虽如此,我仍然不明白为什么匹配组以空格结尾,例如>ABC@hammerfest实际上,
\D
代表任何非数字字符与空格匹配。
“ABC”
后面的单词边界是由于它后面的“2015”造成的:“2015”是另一个“单词”并且它前面的零长度边界与
\\b\\w+\\D
后面的
\b
匹配,谢谢。但是这与Avinash上面的回答“但是空格和下一个字符之间没有单词边界”不矛盾吗