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

如何用正则表达式匹配VSCode代码片段的TextMate变量

背景

  • 您好,我正在开发一款面向代码片段的VSCode扩展,目前已实现对$name格式TextMate风格变量的高亮,例如$CURRENT_YEAR、$TM_FILENAME_BASE这类变量。$name中的name可以是整数,也可以是静态变量。
  • 我还需要对以下类型的变量做高亮:${<INTEGER>:<DEFAULT>}、${<INTEGER>:<DEFAULT>|<OPTIONAL_OPTIONS>},示例包括${2:placeholder}、${1:true|false}。
  • 此外还需要覆盖转换类变量${<STATIC_VAR>\<MATCH_REGEX>\<TRANSFORM_TARGET>\}的高亮,示例${TM_FILENAME/[\.]/_/的作用是将第一个.替换为_。
  • 以上所有示例均可在VSCode官方文档中查看。
  • 我曾接触过Regex Golf练习,但未能解决其中的"Balance"章节题目。

问题诉求

是否有简洁的方案可以通过正则表达式(或其他技术)匹配所有TextMate变量(定义可参考7.2章节)?

具体而言,我需要正则可以匹配所有$<NAME>、${<INTEGER>:<DEFAULT>|<OPTION>}、${<STATIC_VAR>\<MATCH_REGEX>\<TRANSFORM_TARGET>\}格式的变量,其中:

  • <NAME>可以为数字,或LINE_COMMENT这类指定的字符组合;
  • <DEFAULT>可以为任意文本;
  • <STATIC_VAR>为LINE_COMMENT这类指定的字符组合;
  • <MATCH_REGEX>为正则表达式,无需校验其合法性;<TRANSFORM_TARGET>为正则替换输出内容,无需校验其合法性。

我的思路是先检测是否存在成对的大括号,且括号打开后的第一个单词为<NAME>。目前TextMate使用的是K. Kosako开发的Oniguruma正则库。

已做尝试

  • 针对无{}包裹的变量,已实现如下匹配规则:
match:"\\$(?:[0-9]+|TM_SELECTED_TEXT|<TYPED_ALL_POSSIBLE_NAMES>|TM_CURRENT_WORD|LINE_COMMENT)"
  • 尝试过AI正则模式生成工具;
  • 查阅了正则匹配平衡括号相关问题,其中相关回答提到常规正则无法实现该需求;
  • 目前使用临时变通方案如下:
\\$(?= (?=<ALL_NAMES>)|{(?=<ALL_NAMES>):.+} )

其中<ALL_NAMES>代表所有<NAME>用管道符|拼接的内容。

内容的提问来源于stack exchange,提问作者Pablo LION

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:30:02