VScode 片段中匹配 TextMate 变量的正则表达式

Regular Expression to match TextMate Variable in for VScode Snippets

背景

问题

是否有一种巧妙的方法可以将所有 TextMate 变量 (see definition in chapter 7.2) 与正则表达式(或其他技术)相匹配?

详细来说,我希望我的正则表达式匹配所有 $<NAME>${<INTEGER>:<DEFAULT>|<OPTION>}${<STATIC_VAR>\<MATCH_REGEX>\<TRANSFORM_TARGET>\}

哪里

我的想法是检测是否有一对括号(花括号)。括号后的第一个单词是 <NAME>.

TextMate 使用 Oniguruma regular expression library by K. Kosako

我做了什么

match:"\$(?:[0-9]+|TM_SELECTED_TEXT|<TYPED_ALL_POSSIBLE_NAMES>|TM_CURRENT_WORD|LINE_COMMENT)"
\$(?= (?=<ALL_NAMES>)|{(?=<ALL_NAMES>):.+} )

其中 <ALL_NAMES> 表示所有 <NAME> 与管道字符连接 |

您可以在此处使用条件构造:

[$](\{)?\w+(?(1)(?:[\/:].*})?)

参见regex demo

详情:

  • [$] - 一个 $ 字符
  • (\{)? - ID = 1 的可选捕获组,匹配 { char
  • \w+ - 一个或多个单词字符
  • (?(1)(?:[\/:].*})?) - 条件构造:如果第 1 组匹配,则匹配 /: 的可选序列,然后匹配除换行符之外的任何零个或多个字符作为尽可能多,直到最右边出现 } 个字符。

归功于 Wiktor Stribiżew

正则表达式

Test demo with explanation

[$]([{])?([0-9]+)?(?(2)|(?:TM_FILENAME))(?(1)(?(2)[:].+|[\/].+[\/].*[\/])})

这个正则表达式是做什么的:

  • 匹配所有这些(合法 vscode 片段变量):


${1:default}
${1:default|option}
$TM_FILENAME
${TM_FILENAME/[\.]/_/}
${TM_FILENAME/a//}
  • 并匹配 NONE 个:
${1:}
${TM_FILENAME:a|b}
${TM_FILENAME/}
${TM_FILENAME/a/}
${TM_FILENAME//abc/}
${TM_FILENAME/a//a}

完整 .tmLanguage.json 格式代码

"match": "[$]({)?([0-9]+)?(?(2)|(?:TM_SELECTED_TEXT|TM_CURRENT_LINE|TM_CURRENT_WORD|TM_LINE_INDEX|TM_LINE_NUMBER|TM_FILENAME_BASE|TM_FILENAME|TM_DIRECTORY|TM_FILEPATH|RELATIVE_FILEPATH|CLIPBOARD|WORKSPACE_NAME|WORKSPACE_FOLDER|CURRENT_YEAR_SHORT|CURRENT_YEAR|CURRENT_MONTH_NAME_SHORT|CURRENT_MONTH_NAME|CURRENT_MONTH|CURRENT_DATE|CURRENT_DAY_NAME_SHORT|CURRENT_DAY_NAME|CURRENT_HOUR|CURRENT_MINUTE|CURRENT_SECONDS_UNIX|CURRENT_SECOND|RANDOM|RANDOM_HEX|UUID|BLOCK_COMMENT_START|BLOCK_COMMENT_END|LINE_COMMENT))(?(1)(?(2)[:].+|[/].+[/].*[/])})",

在 VSCode

中测试