真正能落地的属性值替换方案需先锁定结构特征再控制匹配边界:双引号用src="(1)",单引号用src='(2)',无引号用src=([a-za-z0-9._-]+);替换时捕获引号以保留格式,如src=(")(1)(")→src=$1new-value$3;处理空白用\s,跨行需(?s)配合非贪婪。" ↩' ↩

^ 和 $ 在 Sublime 里默认按行工作,但属性值替换常涉及跨行、引号嵌套、空格容错等现实干扰——直接套用通用正则几乎必失败。真正能落地的方案,得先锁定结构特征,再控制匹配边界。
匹配带引号的属性值(如 src="xxx")
别用 src=".*?":它在多行 HTML 或含转义引号时容易“破界”,吞掉不该吞的内容。
推荐写法:src="([^"]*)",显式排除双引号,安全边界更可控。
如果属性值可能含单引号或无引号,得拆成三组分别处理:
• 双引号:src="([^"]*)"
• 单引号:src='([^']*)'
• 无引号(仅字母数字):src=([a-zA-Z0-9._-]+)
注意:所有括号必须严格配对,Sublime 不支持 (?:...) 非捕获组,多一个 ( 就多占一个 $1 编号。
替换时保留引号类型并注入新值
不能只写 ,否则会丢掉引号;也不能硬写 "new-value",否则破坏原格式。
正确做法是把引号也纳入捕获:src=(")([^"]*)(") → 替换为 src=new-value
同理,单引号场景:src=(')([^']*)(') → src=new-value
如果想统一转成双引号,就固定写死:src="new-value",但需提前确认目标是否允许格式变更。
想输出字面 $?写成 $$,否则会被当捕获组解析。
处理换行与空白干扰(如 src = "xxx")
真实 HTML 常有空格、Tab、甚至换行:src\n=\n"xxx"。
别开 . matches newline——它会让 ^/$ 失效,且 .*? 极易贪婪回溯卡死。
稳妥方式:src\s*=\s*(")([^"]*)("),其中 \s* 匹配零或多个空白(不含换行),安全又高效。
若真要跨行(比如属性值被折到下一行),改用 (?s)src\s*=\s*(")(.*?)("),(?s) 开启 dotall 模式,让 . 能吃换行符,但务必配合 ? 非贪婪,否则一匹配就到文件末尾。
批量改多个属性值时防误触
比如同时改 src、href、data-url,别写 (src|href|data-url)=...——它会把 https:// 里的 src 也抓进去。
加单词边界不顶用:Sublime 的 \b 把 _ 和 - 当单词字符,data-url 会被切开。
更可靠的是用空格/换行/等号锚定:(?)\s*(src|href|data-url)\s*=\s*(")([^"]*)("),用 (? 向前断言确保前面是空白或标签结束符。<br>执行前一定先点 <code>Find All,看右下角列表是否每条都精准命中目标属性——漏一条或错一条,后面全白干。
.*?,而是没意识到 Sublime 对引号类型、空白容忍度、捕获组编号规则和跨行模式的隐式约束。每次动笔前,花 5 秒用 Ctrl+F 单独验证查找逻辑,比替换完再查错快十倍。











