必须用"(1*)"捕获引号内内容,避免跨引号匹配;替换用而非$1;跨行需(?s)配合更复杂模式;单/中文/反引号需分别处理;操作前务必验证查找是否命中。" ↩

查找引号内内容必须用捕获组,不能只写".*"
直接写".*"会跨引号匹配,比如"foo" bar "baz"会被整个匹配成"foo" bar "baz",而不是两个独立字符串。真正要提取引号内文字,得用"([^"]*)"——括号创建捕获组,[^"]*表示“非双引号的任意字符重复零次或多次”。
常见错误现象:
- 写
".*"却只命中第一对引号到最后一对引号之间的全部内容 - 文本含转义引号如
"He said "hi""时,[^"]*会提前在"处中断(Sublime 默认不识别"为转义,它就当普通字符)
如果确定没有转义引号,"([^"]*)"最安全;若需兼容",得用更复杂的模式,但日常前端代码中极少需要。
替换时引用捕获组必须用,不是$1
Sublime Text 的替换语法只认、,写$1或${1}会原样输出字符,不会解析为捕获内容。
例如:
- 查找:
"([^"]*)" - 替换:
''→ 正确,把双引号换成单引号 - 替换:
'$1'→ 错误,结果是字面量'$1' - 想输出字面
?写成\1
嵌套括号按左括号顺序编号:"(a(b))(c)"中,是a(b),是b,是c。
单引号、中文引号、反引号要分别处理
默认"([^"]*)"只匹配英文双引号。其他引号类型需显式写出:
- 单引号:
'([^']*)' - 中文全角双引号:
“([^”]*)”(注意:引号是全角字符,不是英文") - 反引号(模板字符串):
`([^`]*)` - 混合匹配(不推荐,易误伤):
["'`]([^"'`]*)["'`]——但会把"foo'bar"这种错配成"foo
更稳妥的做法是分两次操作:先统一处理双引号,再单独跑一次单引号。混用正则容易漏匹配或过匹配,尤其在 HTML 或 JS 混排场景下。
跨行引号内容要加(?s)前缀
默认.不匹配换行符,所以"([^"]*)"无法匹配换行的字符串,比如:
"line one line two"
这时必须开启 dotall 模式,在正则开头加(?s):
- 查找:
(?s)"([^"]*)" - 注意:
(?s)只影响其后的.行为,不影响[^"]——所以上式仍不能跨行,因为[^"]本身就不含换行符 - 真正跨行匹配双引号内任意内容,得用
(?s)"((?:(?!").)*)",但太重;实用做法是改用(?s)"([^"]* [^"]*)"手动覆盖常见跨行结构
大多数时候,引号内容不该跨行。如果真有,优先考虑是否该用模板字符串`...`或拆成多行变量——正则强行兜底,反而掩盖了代码结构问题。
.*图标,或者把写成$1后反复试都不生效。每次操作前,先用Ctrl+F验证查找是否命中目标,比直接点Replace All省十分钟。


















