notepad++正则搜索换行符需先勾选「. matches newline」,否则.不匹配\r\n;推荐用\r替代\n以兼容多平台换行符;复杂结构宜分步搜索,注意bom和编码问题。

Notepad++ 正则搜索换行符必须开启「. 匹配换行符」
默认情况下,. 在 Notepad++ 的正则引擎里**不匹配换行符(\r 和 \n)**,所以写 a.b 永远搜不到跨行的 a\nb。想搜多行代码,第一步不是改正则,而是勾选这个开关:「. matches newline」(位于「查找」对话框右下角,搜索模式选「正则表达式」后才会出现)。
没勾它,所有含 . 的跨行匹配都失效——这是 90% 用户卡住的第一步。
用 \R 显式匹配换行,比 \n 更可靠
Windows、macOS、Linux 换行符不同(\r\n / \r / \n),硬写 \n 在跨平台文本里容易漏匹配。Notepad++ 支持 PCRE 的 \R,它能自动识别任意标准换行序列。
比如搜一个函数定义到其首行大括号之间:
function\s+\w+\s*\(.*?\R\s*\{
注意点:
-
.*?是非贪婪匹配,防止一口气吃到文件末尾 -
\R紧跟在.*?后,确保换行是紧挨着参数列表的 - 如果大括号前有空行,得改成
\R\s*\R\s*\{或用\s*覆盖空白
实际场景:搜「if」块里是否调用了 console.log
这类需求常见于代码审计或批量清理。不能只搜单行 if.*console\.log,得覆盖换行、缩进、注释等干扰。
推荐写法:
if\s*\(.*?\)\s*\R\s*\{(?:[^{}]|(?R))*?console\.log
但 Notepad++ 不支持递归 (?R),所以得退而求其次:
- 用
\{[\s\S]*?console\.log(前提是已勾选「. matches newline」) - 更稳妥的是分两步:先定位
if.*?\{,再人工确认块内是否有console.log - 若块很短,可限制行数:
if.*?\R\s*.*?\R\s*.*?console\.log(最多跨两行)
别迷信「一次搜全」,复杂嵌套结构靠正则硬啃容易误伤或漏掉,这时候分段查反而更快。
容易忽略的编码与 BOM 问题
如果文件是 UTF-8 with BOM,开头的 \xEF\xBB\xBF 会被当作普通字符参与匹配,可能导致 ^ 锚点失效或首行匹配偏移。
检查方式:打开「编码」菜单,看当前是 UTF-8 还是 UTF-8-BOM;搜索时若发现明明该匹配却没中,试试转成无 BOM 编码再试。
另外,混合编码(如 GBK 文件里混了 UTF-8 字节)会让 \R 行为异常——此时正则已不可靠,先统一编码再搜索。











