\b(\w+)\s+\1\b能匹配单行内连续重复单词,因\b确保完整单词边界,(\w+)捕获单词,\s+匹配空白,\1回溯引用相同单词,末\b防前缀误判。

Sublime Text 用正则删「单行内连续重复单词」,\b(\w+)\s+\1\b 是最直接有效的模式,但必须注意单词边界、空白类型和大小写敏感性——否则会漏匹配或误删。
为什么 \b(\w+)\s+\1\b 能匹配连续重复单词
这个正则专为“同一行中紧挨着的重复词”设计,比如 hello hello world 中的前两个 hello。它不跨行、不跳词、不匹配部分重叠(如 testing test 不算)。
-
\b确保匹配的是完整单词边界,避免把test从testing里抠出来 -
(\w+)捕获一个纯字母/数字/下划线组成的单词 -
\s+匹配一个或多个空白(空格、Tab,不含换行) -
\1回溯引用,要求后面紧跟着**完全相同**的单词 - 第二个
\b防止class classes被误判为重复(class是classes的前缀,但不是独立重复)
\b(\w+)\s+\1\b 在 Sublime 里怎么用才不出错
直接粘贴进查找框可能不生效,因为 Sublime 默认不启用单词边界和多空格兼容。必须手动调对三处:
- 打开
Ctrl+H替换面板,勾选Regular Expression(.* 图标) - 确保没勾选
Match Case——除非你明确要区分Hello和hello - 替换框填:
$1(只保留第一个词,删掉后面的重复词 + 中间空白),不是留空——留空会把第一个词也干掉 - 如果原文含 Tab 或全角空格,
\s+可能不覆盖;可临时先用Find → Replace把\t和全角空格替换成普通空格再跑正则
常见失效场景和对应解法
你以为删掉了,结果还有漏网之鱼?大概率是下面几种情况之一:
- 重复词之间有换行:
\b(\w+)\s+\1\b不跨行,得先用Find → Replace把\r?\n替换成空格,再运行正则 - 单词含连字符或撇号(如
well-known well-known):\w+不匹配-或',改用([a-zA-Z'-]+)并手动加\b边界控制 - 大小写混用(
Hello hello):勾选Match Case就失效,此时不能依赖\1,得用(?i)\b(\w+)\s+\1\b并在替换时用\L$1统一小写(Sublime 支持\L、\U等转义) - 重复的是短词(如
a a b):\b对单字母有效,但若前后是标点("a" "a"),需改用(? 类更严格的边界
比正则更稳的替代方案:什么时候该放弃正则
当你要处理的不是“连续重复”,而是“单行内任意位置重复出现的词”(比如 apple banana apple),或者需要按语义去重(忽略大小写、缩写、复数),正则就力不从心了。
- 这种需求本质是「行内单词级去重」,不是「连续重复删除」,Sublime 原生不支持,硬套
\b(\w+)\s+\1\b会完全失焦 - 大文件(>10 万词)跑正则容易卡死,Sublime 内存占用飙升,响应停滞
- 真正可靠的做法是切到终端:
python3 -c "import sys; [print(' '.join(dict.fromkeys(line.split()))) for line in sys.stdin]" < file.txt,它按空格切分、用 dict 保序去重、再拼回一行——这才是语义正确的单行内去重

















