我正在解决一个问题,即从字符串中删除重复的单词。例如,
输入:Goodbye bye bye world world world
输出:Goodbye bye world
我有一个来自在线资源的工作模式,但我无法理解其中的所有内容。
String pattern = "\\b(\\w+)(\\b\\W+\\b\\1\\b)*";
以下是我的理解:
\\b
是匹配单词bounaries (\\w+)
匹配一个或多个字符在此表达式中:(\\b\\W+\\b\\1\\b)*
一个。 \\b
匹配字边界
湾\\W+
匹配一个或多个非字字符
℃。 \\b
再次匹配单词bounary
d。 \\1
???我不知道这是为了什么,但如果没有这个,它就无法工作
℃。 \\b
再次匹配单词bounary
正如您所看到的,我的主要困惑是关于第3项,特别是\\1
。
任何人都能更清楚地解释一下吗?
答案 0 :(得分:5)
使用Java,您可以使用前瞻功能使用反向引用删除前面具有相同匹配单词的所有单词:
final String regex = "\\b(\\w+)\\b\\s*(?=.*\\b\\1\\b)";
final String input = "Goodbye bye bye world world world\n";
final String result = input.replaceAll(regex, "");
在此处使用单词边界非常重要,以避免匹配部分单词。