如何用正则表达式匹配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
相关产品推荐
相关产品推荐

