sublime text 批量替换重复词需用正则\b(\w+)\s+\1\b,因\s+防止误匹配粘连词如useruser;跨行需(?s)\b(\w+)\s*\n\s*\1\b并启用. matches newline;失败常因where框未设、正则未启用或编码非utf-8。

Sublime Text 不能直接“识别语义重复词”,所谓批量替换段落中重复词语,本质是用正则匹配「同一行内连续出现两次的相同单词」,再替换成一次——它不分析词性、不理解上下文,只做字符串层面的机械匹配。
为什么 \b(\w+)\s+\1\b 这个正则必须加 \s+
单纯写 \b(\w+)\s+\1\b 是最常用也最稳妥的写法,因为真实文本里重复词之间几乎总隔着空白(空格、制表符、换行)。如果漏掉 \s+,写成 \b(\w+)\1\b,会错误匹配 useruser 或 testtest 这类粘连词,而你实际想处理的是 user user 或 test test。
-
\b确保匹配单词边界,避免把testing里的test也框进来 -
\s+显式要求至少一个空白字符,排除粘连误伤 -
\1是反向引用,必须和前面(\w+)完全一致,大小写敏感 - 若需忽略大小写,得先在查找面板点右下角
Aa图标关闭区分大小写
跨行重复词怎么处理?得用 (?s) 和 \n
默认情况下 . 不匹配换行符,\w+ 更不会跨行。如果重复词分布在两行(比如第一行末尾是 hello,第二行开头也是 hello),必须启用 . matches newline 并改用 (?s) 前缀。
- 先按
Ctrl+H打开替换面板 - 点右下角
.*启用正则,再点右下角.按钮启用. matches newline - 查找框填:
(?s)\b(\w+)\s*\n\s*\1\b - 替换框填:
\1 - 注意:这种跨行匹配在大文件里容易卡顿,建议先限定选区(比如全选某一段落后再操作)
替换后为啥有些没变?检查这三处
常见失败不是正则写错,而是环境没配对:
-
Where框为空 → 只作用于当前文件;要跨文件必须用Ctrl+Shift+F并填.或具体路径 - 右下角
.*没点亮 → 所有\w、\b、\1都当普通字符,\buser\b就是在搜字符串"\buser\b" - 文件编码不是 UTF-8 → GBK 或 ISO-8859-1 编码的文件默认被跳过,右下角状态栏看编码,非 UTF-8 的得先右键转码
真正难的不是写出正则,而是确认它没在 JSON 字符串、注释或正则字面量里误触发——每次点 Find All 后,务必手动扫一眼匹配列表里的上下文,别依赖“数量对就等于安全”。











