最可靠的空行匹配是^\s*$,它强制从行首到行尾仅含空白字符或完全为空;写成^.*$会误删所有行,漏掉$则放过伪空行;需勾选正则模式并关闭. matches newline。

匹配空行和伪空行要写对锚点和空白符
空行清理最常出错的地方,是把 ^\s*$ 写成 ^.*$ 或漏掉 $。前者会误删所有行(因为 .* 总能匹配整行),后者可能只匹配行首、忽略行尾空白,导致“看似空、实则含空格/制表符”的伪空行被放过。
真正可靠的空行匹配是:^\s*$ —— 它强制要求从行首到行尾之间只有空白字符(或完全为空)。如果还要连带删掉换行符本身(防止多空行变成单空行),就得补上 \r?\n,变成 ^\s*$\r?\n。
- 必须勾选「正则表达式」模式,否则
^、$、\s全当普通字符处理 - 先用 Ctrl+F 输入
^\s*$点「全部高亮显示」,确认哪些行真被识别为“可删” - 文件含 UTF-8 BOM(
\xEF\xBB\xBF)时,BOM 不属于\s,不会被^\s*$匹配,需单独处理
删行首缩进别用 ^ +,得用 ^\s+
^ + 只匹配半角空格,遇到制表符 \t 或全角空格就失效;而 ^\s+ 覆盖所有空白类型,且 + 表示“至少一个”,不会误删空行本身(空行没有“行首空白”可删)。
常见踩坑:
- 写成
^\s*:星号允许零次匹配,可能导致替换逻辑异常,甚至触发空行误删 - 替换框里多敲了一个空格:结果每行前面被塞进一个空格,越删越乱
- 想一并删行尾空格却没分步操作:
^\s+对行尾无效,得另跑一次「编辑 → 行操作 → 删除尾部空白」
批量改注释标记得靠分组和反向引用
比如要把所有 # TODO: 换成 // TODO:,不能只搜 TODO:——它可能出现在字符串或正则字面量里。更安全的是锚定上下文:
查找:^(\s*)#( TODO:.*)$
替换:$1//$2
这个写法保留了原始缩进($1),只替换注释符号,避免破坏代码结构。
- 若目标文件混用
#、//、/* */,建议先用「显示符号」功能(视图 → 显示符号 → 显示空格与制表符)观察真实空白分布 - 跨行注释(如 Python 的三引号块)无法用单行正则安全处理,这类必须人工确认
- 替换前务必关闭「. 匹配换行符」选项,否则
.*会吞掉整段内容
正则生效的前提是文件状态和编码干净
再准的正则也救不了只读文件、BOM 干扰或编码错位。Notepad++ 不报错,只是静默不匹配——你看到“0 处替换”,往往不是正则错了,而是环境卡住了。
- 右下角状态栏标着「只读」?右键文件属性关掉只读,否则所有替换都无效
- 打开文件后左下角显示「ANSI」或「UTF-8-BOM」?转成纯「UTF-8」再操作,避免 \s 匹配不到全角空格或某些 Unicode 空白
- 不确定文本里有没有零宽空格(
\u200B)或其它不可见字符?先开「显示符号」,再决定要不要加[\s\u200B-\u200D\uFEFF]+这类扩展
真正难的不是写出正则,而是你面对的那堆文本里,藏着多少种“看起来一样、实际不同”的空白。











