Notepad++中匹配连续重复数字应使用\b(\d+)\s+\1\b,需注意单词边界、空白符处理及负数/浮点数等扩展场景,原生正则不支持跨行全局去重。

匹配连续重复数字用 \b(\d+)\s+\1\b
Notepad++ 的正则引擎默认是 PCRE(v8.3x),支持反向引用,但要注意单词边界 \b 对数字很关键——否则 12 123 会被误判为重复。这个模式只匹配「完全相同的数字」且前后都是单词边界(即被空格、换行或行首/尾隔开)。
常见错误是漏掉 \s+ 或用 \s*:前者会漏掉多个空格/制表符场景,后者可能把 42\n42(换行分隔)也匹配进来,但 Notepad++ 的 \s 默认不包含换行,所以更稳妥的是显式写 (\s+|\r?\n)。
- 想删掉每行末尾的重复数字?用
(\d+)\s+\1$,并勾选「匹配行尾」 - 要保留第一个、删第二个?替换框填
\1(不是留空!否则会多出空白) - 区分大小写?不用管,数字没大小写;但注意关闭「匹配大小写」选项避免干扰
删除非连续但语义重复的数字(如列表中重复项)
上面的正则只处理相邻重复,如果文本是 101 202 101 303 这种跨位置重复,Notepad++ 原生正则做不到全局去重——它没有「回溯整个文档查重」的能力。这时候得换思路:
- 先用
^.*$全选 →Ctrl+J合并为单行 → 再用列编辑(Alt+鼠标拖选)或排序插件辅助 - 更可靠:复制到 Excel,用「删除重复项」功能,再粘回;或用 Python 脚本跑
list(set(map(int, text.split()))) - 别信网上“用
(\d+)(?=.*\1)删除”的说法——Notepad++ 不支持可变长度的先行断言(.*\1中.*长度不定),会直接报错Invalid regular expression
替换后残留多余空格怎么办
用 替换 \b(\d+)\s+\b 后,原本两个数字之间的空格还在,只是少了一个数字,结果变成 123 456(双空格)。这不是 bug,是正则设计使然。
解决方法分两步走:
- 第一步替换:用
\b(\d+)\s+\1\b→\1(删重复,留一个) - 第二步清理:用
\s{2,}→ 单个空格,或更彻底点用[ \t]+→(一个空格) - 如果行首/行尾有多余空格,单独跑一次
^\s+|\s+$→ 留空(注意勾选「匹配行首/行尾」)
为什么 \d+ 有时会匹配到小数或负数
\d+ 本身只匹配数字字符,但它不排斥前后紧贴其他符号。比如文本中有 -123 -123,\b(-?\d+)\s+\1\b 才能正确捕获负号;而 3.14 3.14 中的 .14 会被 \d+ 忽略,导致只匹配到 3 3,漏掉小数部分。
若需支持浮点或负数,必须扩展模式:
- 整数(含负):
\b-?\d+\b - 浮点数(简单版):
\b-?\d+\.?\d*\b(注意\.要转义) - 但复杂浮点如
1e-5就超出 Notepad++ 正则能力了,建议导出用专用工具处理
真正容易被忽略的是 Unicode 数字(比如全角数字 123):Notepad++ 默认不识别,\d 只匹配 ASCII 0–9。遇到这类文本,先统一转半角再操作。


















