显示所有字符是正则替换前的必做动作,因隐藏字符(如Tab、空格、CRLF、不换行空格等)会导致匹配失败;开启“视图→显示符号→显示所有字符”可直观识别·(空格)、→(Tab)、¶(换行符)及行尾CRLF/LF,避免对齐假象、跨行失效和边界误判。

Notepad++ 正则批量处理不是“会写正则就行”,而是“看清结构+选对模式+控制边界”三件事同时做对才不出错。
为什么显示所有字符是正则替换前的必做动作
很多正则失败,根本不是表达式写错了,而是你没看见隐藏字符。比如从 Excel 复制过来的 CSV,看着每行字段对齐,实际混用了 Tab 和空格;日志里时间戳后跟着不可见的 \r 或 \u00A0(不换行空格),导致 ^2026-\d{2}-\d{2} 匹配不到。
必须打开:视图 → 显示符号 → 显示所有字符。这时你能立刻分辨:
-
·是空格,→是Tab,¶是换行符 - 行尾出现
CRLF还是LF,直接影响\r?\n是否能匹配整行 - 有没有多余的
^M(Windows 换行残留),它会让正则跨行失效
不看这个,直接写 ^\s*info\s*$ 去删日志里的 info 行,大概率删不干净——因为有些行末尾有空格或 Tab,但你看不见。
删除整行时,^.*关键词.*\r?\n 的三个陷阱
这个模式看似万能,实操中常因三个细节翻车:
- 没勾选
. matches newline:如果关键词跨两行(比如日志里堆栈信息),.就匹配不到换行符,整行删不掉 - 没处理
\r\n和\n差异:Windows 文件用CRLF,Linux 日志可能是LF,只写\n会漏掉 Windows 行;稳妥写法是\r?\n - 关键词本身含正则元字符:比如删含
[ERROR]的行,[和]是字符类界定符,必须转义成\[ERROR\],否则匹配逻辑全乱
更安全的写法:^[^\r\n]*关键词[^\r\n]*\r?\n,用 [^\r\n] 替代 .,避免跨行误匹配,也绕过 . matches newline 开关的影响。
\d 删数字为什么有时删不干净?关键在换行符处理
用 \d 删除所有数字,最常见失败场景是:文件里有大量换行符紧挨着数字,比如:
abc 123 def
如果勾选了 . matches newline,\d 本身不受影响(它只匹配数字),但后续清理空行时,^\s*$\r?\n 就可能匹配失败——因为 \s 默认不含 \r,而某些旧版 Notepad++ 对 \s 的定义不一致。
所以删数字后要清空行,分两步更稳:
- 第一步:查找
\d,替换为空(确认未勾选. matches newline) - 第二步:查找
^\s*$\r?\n,替换为空(此时必须勾选. matches newline,否则^\s*$匹配不到只含换行符的空行)
顺序不能颠倒。先清空行再删数字,会导致空行被跳过,数字残留行变成真·空行,反而更难识别。
捕获组反向引用时,$1 和 \1 到底该用哪个
Notepad++ 用的是 PCRE 引擎,但替换字段里只认 $1、$2,不支持 \1。写成 \1 不报错,但不会展开为捕获内容,而是字面量输出 \1。
典型翻车现场:
- 想把
name=John改成NAME=John,写查找:name=(\w+),替换:NAME=\1→ 结果是NAME=\1,不是NAME=John - 正确写法:替换填
NAME=$1 - 多层嵌套时,
$0表示整个匹配串,$1是第一组,别数错括号层级
另外注意:中文括号 () 或全角符号不能当捕获组,必须用英文 ()。复制别人写的正则时,尤其要检查括号是不是半角。











