Sublime Syntax正则仅高亮分隔符内匹配内容的实现问询
在Sublime Text 3语法包中匹配分隔符内内容(不含分隔符)的正则方案
嘿,我完全懂你的需求——你想在ST3的语法高亮规则里,只把<this>里的this标亮,而不是连<>一起选中高亮对吧?这其实用正则的零宽断言就能轻松解决,这类断言不会“消耗”字符,只会检查匹配位置的前后条件,刚好能满足你只抓中间内容的需求。
核心思路:正向/反向预查组合
你需要用到两种零宽断言:
- 反向预查
(?<=<):确认当前位置的前面是<,但<不会被纳入匹配结果 - 正向预查
(?=>):确认当前位置的后面是>,同样>`不会被纳入匹配结果
把这两个和中间的内容匹配结合起来,就能精准选中分隔符内的文本了。
具体实现示例
1. 针对.sublime-syntax格式(ST3推荐的YAML格式)
如果你的语法包用的是现代的.sublime-syntax文件,直接在规则里写:
# 匹配< >之间的内容,不含< >本身 - match: '(?<=<).*?(?=>)' scope: markup.your-custom-scope.here
.*?用的是非贪婪匹配,避免从第一个<直接匹配到最后一个>`,确保只抓单个标签内的内容scope替换成你需要的高亮范围(比如markup.italic、string.quoted这类)
2. 针对旧版.tmLanguage格式(XML格式)
如果你的语法包是XML格式的.tmLanguage,注意要转义正则里的<和>(XML里特殊字符需要转义):
<dict> <key>match</key> <!-- 转义后:(?<=<)变成(?<=<),(?=>)变成(?=>) --> <string>(?<=<).*?(?=>)</string> <key>name</key> <string>markup.your-custom-scope.here</string> </dict>
扩展到其他分隔符
如果你的分隔符不是<>,比如[ ]、{{ }}这类,只需要修改预查里的字符就行:
- 匹配
[content]里的content:(?<=\[).*?(?=\]) - 匹配
{{ content }}里的content:(?<=\{\{).*?(?=\}\})(正则里大括号是特殊字符,需要加反斜杠转义)
注意事项
- 一定要用非贪婪匹配
.*?,而不是贪婪的.*,不然会出现跨多个分隔符的错误匹配 - 如果分隔符本身需要被其他规则高亮,可以单独给
<和>写另一条匹配规则,比如:
这样分隔符会有自己的样式,中间的内容则用你之前的规则高亮。- match: '<' scope: punctuation.definition.tag.open.yourlanguage - match: '>' scope: punctuation.definition.tag.close.yourlanguage
内容的提问来源于stack exchange,提问作者tsouchlarakis
相关产品推荐
相关产品推荐

