Sublime Text查找替换括号内容需按括号类型和场景选择正则:圆括号用(([^()]*))非贪婪匹配;花括号/方括号加(?s)跨行并禁嵌套;HTML标签须排除尖括号内字符,避免跨标签误匹配。

Sublime Text 查找替换括号里的内容,关键不是“能不能”,而是括号类型、是否嵌套、是否跨行——不同场景必须用不同正则写法,否则要么漏匹配,要么吞掉不该动的部分。
匹配圆括号 () 内的纯文本(无嵌套)
这是最常见需求,比如把 func(a, b) 中的 a, b 提取出来或替换成其他内容。必须用非贪婪匹配,否则 func(x) + func(y) 会被当成一个整体。
- 查找:
(([^()]*))—— 匹配一对不含括号的圆括号及其内容,[^()]*比.*?更安全,避免跨括号误抓 - 替换:
$1(只留括号内)或[$1](加中括号包裹) - 务必先按
Alt+R(Windows/Linux)或Cmd+Alt+R(macOS)启用正则模式,右下角显示.*才生效 - 如果原文有转义括号如
(escaped),需额外处理:查找\?(([^()]*)\?),但更稳妥是先人工过滤或分步操作
匹配花括号 {} 或方括号 [] 内内容(含简单换行)
JSON、CSS、对象字面量常含换行和缩进,.*? 默认不跨行,直接失效。
- 查找:
(?s){([^{}]*)}——(?s)启用 dotall 模式,让.匹配换行符;[^{}]*仍限制不跨层 - 替换时若要保留缩进,得在查找中捕获它:
^(s*){([^{}]*)}→$1[$2] - 注意:
{.*?}看似简洁,但遇到{a: {b: 1}}会停在第一个},导致截断;真正嵌套需用插件或手动分治 - 方括号同理,把
{和}换成[和],记得转义
提取 HTML 标签内容(尖括号 )
别用 <.> —— 它会跨标签,比如 可能被整段匹配。安全做法是禁止出现 或 > 的内部字符。
- 查找:
或更通用的([^
]*>([^]*>(仅限单层、无属性干扰的简易场景) - 如果标签含属性如
,应改用,]*>([^
[^>]*表示“非>字符任意次” - 想替换整个标签为 Markdown 形式?查找:
,替换:([^ #$2($1是数字,$2是标题文本) - 所有括号类匹配都依赖
.*按钮开启,且替换中只能用、,不能写$1(Sublime 不支持)
为什么总替错?三个高频卡点
真正出问题的地方,往往不在正则多难,而在编辑器行为和边界没对齐。
-
Replace All按钮灰掉?检查:替换框是否为空、当前文件是否只读(右下角标RO)、是否在折叠区域(Sublime 跳过折叠行) - 明明写了
((.*?))却一条不中?确认.*图标已高亮;再检查括号是否被当字面量——比如写成(.*)没转义(和),实际应为((.*?)) - 替换后格式崩了?因为正则吞掉了前后空格或换行。例如把
foo( bar )替成bar,原始空格全丢。解决办法:查找foos*(([^)]*))s*,替换$1,显式匹配并丢弃空格
括号匹配看着简单,但每种括号的转义规则、嵌套容忍度、跨行控制都不同;与其死记正则,不如先用 Ctrl+F 测试表达式能否高亮目标,再动替换——毕竟 Sublime 不存历史快照,Ctrl+Z 是最后一道防线。











