如何用Java正则表达式去除句子中所有重复单词?
去除句子中所有重复单词的解决方案
你当前使用的正则\b(\w+)(?:\W+\1\b)+仅能匹配连续重复的单词,因为它是在捕获的单词后查找紧跟的重复项,无法处理非连续的重复实例(比如示例中第三个have)。要实现删除所有重复单词(保留首次出现的),需要结合代码逻辑跟踪已出现的单词,以下是具体实现:
通用解决方案(多数编程语言适用)
正则本身无状态,无法记忆已匹配过的单词,因此需要借助替换函数或数组过滤逻辑记录已保留的单词,只保留每个单词的首次出现:
Python 示例
import re def remove_duplicates(sentence): seen = set() def replace(match): word = match.group(1) if word not in seen: seen.add(word) return word return '' # 匹配所有单词,替换重复项为空 cleaned = re.sub(r'\b(\w+)\b', replace, sentence) # 清理多余空格并修剪首尾 return re.sub(r'\s+', ' ', cleaned).strip() # 测试 test_sentence = "I have have a nice have car" print(remove_duplicates(test_sentence)) # 输出: I have a nice car
JavaScript 示例
function removeDuplicateWords(sentence) { const seen = new Set(); return sentence.split(/\s+/) .filter(word => { if (!seen.has(word)) { seen.add(word); return true; } return false; }) .join(' '); } // 测试 const testSentence = "I have have a nice have car"; console.log(removeDuplicateWords(testSentence)); // 输出: I have a nice car
注意事项
- 上述方案会保留单词的首次出现顺序,删除后续所有重复项;
- 如果需要忽略大小写差异(比如不区分
Have和have),可以在添加到集合前统一转换为小写(或大写),同步调整匹配逻辑。
内容的提问来源于stack exchange,提问作者Prickachu
相关产品推荐
相关产品推荐

