必须启用多行模式(勾选matches newline)并用捕获组\1\2保留标签结构,否则会漏匹配、跨标签或静默失败;注释和字符串中的标签无法识别,需预处理注释,验证时须三连验:查不替→\0验证→小范围试替。

能批量修改,但必须用多行模式 + 正确分组引用,否则会漏匹配、跨标签或静默失败。
必须勾选“Matches newline”才能处理含换行的标签内容
默认情况下 . 不匹配 \n 或 \r,所以像 <script>console.log(1);</script> 这种换行写的标签,用 <script>.*</script> 根本抓不到——它只在单行内找,遇到换行就停。
必须打开 Ctrl + H 替换窗口,勾选底部的 Matches newline(等价于 PCRE 的 /s 修饰符)。
启用后,[sS] 或 [\s\S] 才真正表示“任意字符(含换行)”,这是跨行匹配的底层基础。
老版本(v7.8 及以下)不支持 \R,换行符要严格对应文件编码:Windows 文本用 \r\n,Unix/Linux 用 \n,混用会断匹配。
删内容但保留标签和属性,得用捕获组 \1 和 \2
目标是把 <script src="a.js">alert(1);</script> 变成 <script src="a.js"></script>,而不是删成空字符串或破坏属性。
正确写法是:
Find what: (<script>]*>)[\s\S]*?(</script>)Replace with: \1\2
要点:
- [^>]* 容忍 type="text/javascript" 这类属性,避免误吞闭合尖括号
- *? 是非贪婪匹配,防止从第一个 <script></script> 一路吃到文件末尾的最后一个
- 捕获组只认 \1~\9,不能写 $1 或 \01;\0 表示整个匹配串,仅用于验证阶段,不能用于替换
- 如果标签是自闭合形式(如 <script></script>),此正则不适用——HTML 标准中 <script></script> 不允许自闭合
注释里的标签会被误删,正则无法识别 HTML 注释边界
Notepad++ 没有 HTML 解析器,纯靠字面匹配。只要文本里出现 <script></script> 和 ,不管它在 <!-- --> 里还是字符串里,都会被当作真实标签处理。
典型误删场景:<!-- <script>do_something()</script> --> 会被清空成 <!-- -->。
临时规避方法只有两步:
- 先用 <!--[\s\S]*?--> 把所有注释块替换成空(注意同样要勾选 Matches newline)
- 再执行脚本内容清理
如果代码里有动态拼接(如 document.write("<script>...</script>")),正则完全无解——这不是结构化 HTML,而是运行时生成的字符串,别硬刚。
常见错误现象与验证习惯
最常踩的坑不是表达式写错,而是跳过验证直接“全部替换”:
- 状态栏没确认是 正则表达式 模式 → 所有 \d、^、() 都当字面字符处理,不报错也不提示,静默失效
- 没先点 查找全部 预览匹配结果 → 误删、跨标签、漏行全靠猜
- 没用 \0 在替换框里试输出完整匹配 → 无法确认捕获组是否捕对了位置
强烈建议养成三连验:查不替 → \0 验证 → 小范围试替。复杂文件务必先备份,尤其是带 BOM 的 UTF-8 文件,\R 在这类文件里容易失灵。











