notepad++中用https?://1+匹配url易失败,因未处理转义字符、换行符及全角符号;应锚定href/src属性并捕获引号内内容,确保utf-8编码,替换时用$1$2格式导出纯净链接列表。\s ↩

Notepad++ 里直接用 https?://[^\s]+ 匹配网址,遇到带括号、问号、井号、中文、全角符号的链接大概率失败——不是漏掉就是多抓一堆 JS 字符串或注释里的假链接。
为什么简单匹配 URL 总是出错
常见错误现象:匹配到 href="https://example.com/path?name=张三&id=1" 时只截到 https://example.com/path?name=张三(停在 &);或者把 // 这是注释 https://fake.com 也当链接;更糟的是,src="./img/图标.png" 这种含中文或全角字符的路径完全不命中。
根本原因有三个:
- 正则引擎默认不识别 URL 中合法但需转义的字面符号(如
?、&、(、)、(、)),不加反斜杠会当成元字符解析 -
[^\s]在含换行或制表符的 HTML 源码里会提前中断(.不匹配换行,[^\s]同理) - 全角引号(“”)、全角括号(())、全角问号(?)无法被 ASCII 正则覆盖,且
\s不匹配全角空格(\u3000)
真正能跑通的 href/src 提取正则
别碰 http 开头的模糊匹配。定位 HTML 属性值才是稳定解法,关键在两点:属性名锚定 + 引号内贪婪捕获。
实操建议:
- 打开
Ctrl + F→ 切到「查找」→ 勾选「匹配正则表达式」 - 输入:
href\s*=\s*["']([^"']+)["']|src\s*=\s*["']([^"']+)["'] - 务必先确认编码为 UTF-8(菜单栏「编码」→「转为 UTF-8 编码」),否则中文路径、全角引号直接不匹配
- 这个正则用两个捕获组:
$1是href的值,$2是src的值;替换时用$1$2可合并输出
特殊符号要手动转义,不能靠 \w 或 . 通吃
如果目标文本里明确含括号、井号等干扰符号(比如 href="/page#section(2024)"),原始正则仍可能被截断。这时得对属性值内部做防御性收口:
- 把
[^"']+改成[^"'\r\n\t]+,排除回车、制表符等隐形中断源 - 若已知链接末尾常带
)或),且你只想抓到那里为止,可写成:href\s*=\s*["']([^"'\r\n\t]*?[^\s\)\uff09]*)["'](\uff09是全角右括号 Unicode 码点) - 匹配含
?或&的查询参数时,不要试图用[^?&\s]—— 它们本就是 URL 合法字符,应保留在捕获范围内;真正要防的是它们出现在引号外,所以锚定引号仍是关键
批量导出纯净 URL 的最后一步
查出来只是高亮,要提取成列表还得走替换流程:
- 按
Ctrl + H打开替换 → 查找框填同上正则:href\s*=\s*["']([^"']+)["']|src\s*=\s*["']([^"']+)["'] - 替换框填:
$1$2\r\n(Windows 换行)或$1$2\n(Linux 风格) - 点击「全部替换」后,文档里全是 URL 行,但会有空行(因为有些匹配只触发了
$1或$2) - 用「编辑」→「空白字符操作」→「移除空行」清理,再
Ctrl + A→Ctrl + C即可复制完整列表
最易被忽略的是:替换时若用了旧版语法 \1 而非 $1,Notepad++ 新版本(v8.5+)会原样输出字符串而非引用内容——这个坑没有报错,只有结果为空。











