我的任务是创建一个正则表达式,用它可以检测多次出现的同一个单词,并将它们全部替换为第一次出现的单词。
到目前为止我想到的是:(\\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
。我应该修改什么才能尊重单词边界?
最佳答案
重复单词边界:
"\\b(\\w+)\\s\\1\\b"
^^^
将单词边界模式放入捕获组中这一事实并不意味着单词边界语义是通过反向引用传递的。反向引用仅存储捕获的文本值,而不存储其匹配的上下文。
此外,模式中隐式存在一些单词边界:\w+
和 \s
之间以及 \s
和 之间\1
(空格是非单词字符)。因此,您只需要在前面添加一个 \b
,在模式末尾添加一个 \b
。
关于java - 如何让 Java 检测反向引用,同时尊重字边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45509395/