You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中使用正则移除连续及非连续重复单词?

嘿,这个问题我刚好有经验!你找的这个正则(?s)(\b\w+\b)(?=.*\b\1\b)其实已经找对了方向,不过直接用它替换会保留最后一次出现的重复单词,而你需要的是保留首次出现的,所以我们可以用一个小技巧——反转字符串来实现,具体步骤如下:

原理拆解

先搞懂你这个正则的作用:

  • (?s):开启单行模式,让.能匹配换行符(对你的单行字符串来说其实非必需,但保留也没问题)
  • (\b\w+\b):捕获一个完整的单词(\b是单词边界,确保不会匹配单词的一部分)
  • (?=.*\b\1\b):正向预查,确保当前捕获的单词后面还会再次出现(\1引用刚才捕获的单词)

这个正则会匹配所有「后面还有重复项的单词」,直接替换为空的话,最后剩下的是每个重复单词的最后一次出现。那我们反过来操作,就能拿到首次出现的:

具体实现步骤

  1. 反转原始字符串:把重复单词的出现顺序倒过来
  2. 用你的正则替换反转后的字符串:此时匹配的是反转后「后面还有重复项的单词」,也就是原字符串里「后面出现的重复单词」
  3. 再次反转字符串:恢复原本的顺序,此时就保留了每个单词的首次出现
  4. 清理多余空格:替换过程中可能会留下多个连续空格,需要合并成单个空格并去除首尾空格

代码示例(以Python为例)

import re

# 原始字符串
original_str = "Hello to everyone hello in this world world"

# 步骤1:反转字符串
reversed_str = original_str[::-1]

# 步骤2:用你提供的正则替换(加i标志处理大小写不敏感的重复)
pattern = r'(?si)(\b\w+\b)(?=.*\b\1\b)'
reversed_processed = re.sub(pattern, '', reversed_str)

# 步骤3:反转回原顺序
result = reversed_processed[::-1]

# 步骤4:清理多余空格
final_result = re.sub(r'\s+', ' ', result).strip()

print(final_result)  # 输出:Hello to everyone in this world

关于大小写的说明

你的目标结果里Hello保留而hello被移除,说明需要不区分大小写的重复判断,所以我在正则里加了i标志(不区分大小写),这样就能把大小写不同的相同单词视为重复项,只保留首次出现的那个。

其他语言的类似实现(比如JavaScript)

const originalStr = "Hello to everyone hello in this world world";

// 反转字符串的工具函数
function reverseStr(str) {
  return str.split('').reverse().join('');
}

// 步骤1:反转字符串
const reversedStr = reverseStr(originalStr);

// 步骤2:替换(开启全局+不区分大小写匹配)
const pattern = /(?s)(\b\w+\b)(?=.*\b\1\b)/gi;
const reversedProcessed = reversedStr.replace(pattern, '');

// 步骤3:反转回原顺序
const result = reverseStr(reversedProcessed);

// 步骤4:清理空格
const finalResult = result.replace(/\s+/g, ' ').trim();

console.log(finalResult); // 输出:Hello to everyone in this world

这样就完美实现你的需求啦!

内容的提问来源于stack exchange,提问作者Code Hard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:17:59