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

标签 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() + "<");
}

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

结果打印输出

>ABC <
>2015 < 

似乎证实了这一点,但是稍微改变 str 开始引起怀疑上述匹配解释是否正确。例如

  • 将其修改为带有尾随空格的“ABC 2015 ABC1 ”似乎会产生完全相同的结果,但与 >ABC1 不匹配<

  • 将其修改为没有尾随空格的“ABC”会产生 >ABC< 似乎表明\D 现在可能与“C”匹配,因此 w+ 不会贪婪地消耗所有字母字符

  • 将其修改为带有尾随空格的“ABC”会再次产生 >ABC<,进一步混淆情况

如果有人能解释什么是正确的解释,我们将不胜感激

最佳答案

and then non-digit \D for the whitespace.

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

你的正则表达式必须是,

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

关于java - 正则表达式与空格/非数字/单词边界匹配解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32952128/

相关文章:

java - 从上一步输入数据表后验证数据表中的期望

java - Android 上的多播不想在屏幕关闭时工作

java - 为什么正则表达式无法识别行的开头?

sql - Oracle SQL - 在字段中查找特殊非数字字符

string - 具有多个选项的子字符串提取

java - Java 中的操作优先级。 (对象在 GUI 更新之前实例化并运行?)

java - 在类方法声明中使用 "super"关键字

php - 使用 php 替换 css 中的前导点和斜线

regex - ReplaceAll 和 ReplaceAllMapped 无法正常工作

java - 方法返回类型 String 不是 String