notepad++无法用正则直接合并行内相邻重复字符(如aaabbb→abc),因其正则引擎按行锚定,不支持跨字符状态累积;需用(.)\1+替换\1实现单字节字符压缩,但中文等unicode字符无效。

Notepad++ 不能用正则直接合并“相邻重复行字符”
这不是操作不熟的问题,而是概念混淆——^(.*\r?\n)\1+ 这类正则匹配的是**整行重复**(即完全相同的两行或多行),不是“行内相邻重复字符”,比如 aaabbbccc 中的 aaa。Notepad++ 的行级正则引擎根本不处理跨字符边界的状态累积,也没有类似 (.)\1+ 这种针对单字符连续重复的「行内」捕获能力——它默认按行锚定,^ 和 $ 绑定到每行首尾,而非整个文档。
想删掉行内连续重复字符(如 aaaaa → a)?得换思路
Notepad++ 原生支持的是「行内重复字符」的简单压缩,但必须绕开行锚定干扰,且仅适用于 ASCII 单字节字符(中文、emoji 等 Unicode 字符可能失效):
- 打开替换对话框(
Ctrl + H),搜索模式选「正则表达式」 - 查找目标填:
(.)\1+—— 注意括号和反斜杠要完整,它匹配任意一个字符后紧跟≥1个相同字符 - 替换为填:
\1—— 只保留第一个 - 勾选「匹配大小写」(避免误吞大小写变体),不勾选「全字匹配」
- 点「全部替换」,可能需执行多次(因一次只消最左一组)
⚠️ 限制很实在:遇到 aa bb cc(含空格)会变成 a b c,但 测试测试 不会变,因为中文字符在多数正则引擎中不被 . 单独捕获;\p{L} 类语法 Notepad++ 不支持。
合并多行成一行?别用错模式
这是最常被误标为“去重”的操作,实际是**消除换行符**。关键不是正则多高级,而是换行符类型必须对上:
- 先确认文档换行符:菜单「视图 → 显示符号 → 显示所有字符」,看行尾是
CRLF还是LF - 若显示
CRLF,查找填:\r\n;若显示LF,查\n—— 用错就毫无反应 - 「查找模式」必须选「正则表达式」,不能选「扩展」,否则
\r\n被当字面量,不解释为换行 - 替换为可填空(直接拼接)、填
,(逗号加空格)或\t(制表符) - 如果合并后开头/结尾多出逗号,再补两步正则:
^, ?→ 空,, ?$→ 空
真正想合并“逻辑上重复的行”?先排序再正则
比如日志里有 5 行 ERROR: timeout 散落在不同位置,你想只留一行——这不是行内字符重复,而是**跨行内容重复**。Notepad++ 没有全局哈希比对,唯一稳解是让它们物理相邻:
- 全选(
Ctrl + A),统一换行符:「编辑 → 文档格式转换 → 转换为 Windows 格式」 - 排序:「编辑 → 行操作 → 排序行(升序)」
- 替换:查找
^(.*\r?\n)\1+,替换为\1,反复点「全部替换」直到提示无匹配 - 最后「编辑 → 行操作 → 移除空行」清理残留
原始顺序丢了?那就得提前加序号锚点(Alt + C 插入数字),排序→正则→删序号列。这四步看着琐碎,但跳过任何一步,结果都不可靠——尤其是换行符不统一,\r?\n 就会漏匹配。











