You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>
  <!-- 转义后:(?<=<)变成(?&lt;=&lt;),(?=>)变成(?=&gt;) -->
  <string>(?&lt;=&lt;).*?(?=&gt;)</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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:45:14