java - 如何让 Java 检测反向引用,同时尊重字边界?

标签 java regex

我的任务是创建一个正则表达式,用它可以检测多次出现的同一个单词,并将它们全部替换为第一次出现的单词。

到目前为止我想到的是:(\\b\\w+\\b)\\s{1}\\1

但是,这会检测到例如赛马中的第二匹。我只想检测完全匹配,即我希望尊重我提供的单词边界。

令我惊讶的是, (\\b\\w+\\b)\\s{1}\\1 似乎与 \\b(\\w+ )\\b\\s{1}\\1

一些替换示例:

再见再见世界世界世界 -> 再见再见世界
Sam 去了他的公司 -> Sam 去了他的公司
Reya 是 Eye Eye 游戏中最好的玩家 -> Reya 是 Eye Eye 游戏中最好的玩家

但是上面三个工作正常:

in inthe 变为 inthe 而不是 in inthe。我应该修改什么才能尊重单词边界?

enter image description here

最佳答案

重复单词边界:

"\\b(\\w+)\\s\\1\\b"
                ^^^ 

请参阅\b(\w+)\s\1\b regex demo .

将单词边界模式放入捕获组中这一事实并不意味着单词边界语义是通过反向引用传递的。反向引用仅存储捕获的文本值,而不存储其匹配的上下文。

此外,模式中隐式存在一些单词边界:\w+\s 之间以及 \s 之间\1 (空格是非单词字符)。因此,您只需要在前面添加一个 \b,在模式末尾添加一个 \b

关于java - 如何让 Java 检测反向引用,同时尊重字边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45509395/

相关文章:

php - 正则表达式与换行符不匹配

java - 使用 Java 替换一组重复的 xml 标签

java - 获取枚举实例

Linux 上的 Java 分析

java - 如何使用 StartTLS 获取 LDAP 服务器的 SSL 证书?

javascript - 在 JavaScript 中,空正则表达式模式是否具有定义的行为?

java - Vagrant 运行游戏框架

java - 为什么我不能在 Java 中解析模式为 "MMMMM dd"的 SimpleDateFormat?

ruby-on-rails - 创建时的 Ruby (Rails) 字符串操作

python - 使用正则表达式从 python 中的 readline() 获取一些子字符串