如何用正则匹配引号内除特定$(...)宏模式外的内容?
匹配引号内非宏内容的正则实现方案
核心思路
要实现只匹配双引号里除$(...)宏之外的内容(包括引号本身),可以用正则的负向预查避开宏的起始标记,同时锁定双引号的范围,精准提取需要高亮的普通文本部分。
基础版正则(无嵌套括号宏)
如果你的宏是简单非嵌套结构(比如$(bar)),用这个正则就够了:
"[^$"]*(?:(?!\$\()[^$"])*"
拆解释义
":精准匹配字符串的起始双引号[^$"]*:先匹配一段既不是$也不是双引号的普通文本(覆盖宏出现前的内容)(?:(?!\$\()[^$"])*:非捕获分组,确保当前位置不是$(的开头,再继续匹配普通文本(覆盖宏出现后的内容)":匹配字符串的结束双引号
进阶版正则(支持嵌套括号宏)
如果宏里允许嵌套括号(比如$(foo(bar))),就得用递归匹配处理嵌套结构,避免误截断:
"[^$"]*(?:(?!\$\()[^$"]|(\$(?:[^()]|(?1))*\)))*"
这个版本能正确识别嵌套的括号,不会把$(foo(bar))拆成两个宏。
实际测试效果
拿你给出的例子验证:
- 输入
"This is a $(macro)"→ 匹配到"This is a "和" - 输入
"$(macro)This is also a macro literal"→ 匹配到"和"This is also a macro literal" - 输入无宏的字符串
"This is a literal..."→ 匹配整个字符串 - 输入全是宏的
"$(only macro here)"→ 匹配到开头和结尾的" - 输入
SPRINTF("$(Vendor)")→ 匹配到"和"
语法高亮使用建议
在工具里分两步配置:
- 用上面的正则匹配普通字符串内容,设置一种高亮颜色
- 再用
\$\((?:[^()]|(?1))*\)单独匹配宏内容,设置另一种颜色
两者配合就能实现类似JS模板字符串的区分高亮效果。
内容的提问来源于stack exchange,提问作者Emberfire
相关产品推荐
相关产品推荐

