VScode 片段中匹配 TextMate 变量的正则表达式
Regular Expression to match TextMate Variable in for VScode Snippets
背景
大家好,我正在开发 VScode 片段扩展。我突出显示了所有 $name
TextMate 样式变量,例如 $CURRENT_YEAR
和 $TM_FILENAME_BASE
.
name
in $name
可以是整数,也可以是静态变量。
我还想突出显示 ${<INTEGER>:<DEFAULT>}
、${<INTEGER>:<DEFAULT>|<OPTIONAL_OPTIONS>}
等变量
例如${2:placeholder}
和 ${1:true|false}
此外,突出显示已转换的变量 ${<STATIC_VAR>\<MATCH_REGEX>\<TRANSFORM_TARGET>\}
。示例:${TM_FILENAME/[\.]/_/
将第一个 .
替换为 _
。
所有这些例子都可以在VScode documentation
中找到
我玩了一点Regex Golf,没能解决“平衡”一章
问题
是否有一种巧妙的方法可以将所有 TextMate 变量 (see definition in chapter 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 使用 Oniguruma regular expression library by K. Kosako
我做了什么
- 不带
{}
和 的匹配变量
match:"\$(?:[0-9]+|TM_SELECTED_TEXT|<TYPED_ALL_POSSIBLE_NAMES>|TM_CURRENT_WORD|LINE_COMMENT)"
- 尝试过regex pattern generator (AI)
- 有问题Regular expression to match balanced parentheses is it said not possible in this answer
- 使用肮脏的解决方法
\$(?= (?=<ALL_NAMES>)|{(?=<ALL_NAMES>):.+} )
其中 <ALL_NAMES>
表示所有 <NAME>
与管道字符连接 |
您可以在此处使用条件构造:
[$](\{)?\w+(?(1)(?:[\/:].*})?)
参见regex demo。
详情:
[$]
- 一个 $
字符
(\{)?
- ID = 1 的可选捕获组,匹配 {
char
\w+
- 一个或多个单词字符
(?(1)(?:[\/:].*})?)
- 条件构造:如果第 1 组匹配,则匹配 /
或 :
的可选序列,然后匹配除换行符之外的任何零个或多个字符作为尽可能多,直到最右边出现 }
个字符。
归功于 Wiktor Stribiżew
正则表达式
[$]([{])?([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
中测试
背景
大家好,我正在开发 VScode 片段扩展。我突出显示了所有
$name
TextMate 样式变量,例如$CURRENT_YEAR
和$TM_FILENAME_BASE
.name
in$name
可以是整数,也可以是静态变量。我还想突出显示
${<INTEGER>:<DEFAULT>}
、${<INTEGER>:<DEFAULT>|<OPTIONAL_OPTIONS>}
等变量 例如${2:placeholder}
和${1:true|false}
此外,突出显示已转换的变量
${<STATIC_VAR>\<MATCH_REGEX>\<TRANSFORM_TARGET>\}
。示例:${TM_FILENAME/[\.]/_/
将第一个.
替换为_
。所有这些例子都可以在VScode documentation
中找到我玩了一点Regex Golf,没能解决“平衡”一章
问题
是否有一种巧妙的方法可以将所有 TextMate 变量 (see definition in chapter 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 使用 Oniguruma regular expression library by K. Kosako
我做了什么
- 不带
{}
和 的匹配变量
match:"\$(?:[0-9]+|TM_SELECTED_TEXT|<TYPED_ALL_POSSIBLE_NAMES>|TM_CURRENT_WORD|LINE_COMMENT)"
- 尝试过regex pattern generator (AI)
- 有问题Regular expression to match balanced parentheses is it said not possible in this answer
- 使用肮脏的解决方法
\$(?= (?=<ALL_NAMES>)|{(?=<ALL_NAMES>):.+} )
其中 <ALL_NAMES>
表示所有 <NAME>
与管道字符连接 |
您可以在此处使用条件构造:
[$](\{)?\w+(?(1)(?:[\/:].*})?)
参见regex demo。
详情:
[$]
- 一个$
字符(\{)?
- ID = 1 的可选捕获组,匹配{
char\w+
- 一个或多个单词字符(?(1)(?:[\/:].*})?)
- 条件构造:如果第 1 组匹配,则匹配/
或:
的可选序列,然后匹配除换行符之外的任何零个或多个字符作为尽可能多,直到最右边出现}
个字符。
归功于 Wiktor Stribiżew
正则表达式
[$]([{])?([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)[:].+|[/].+[/].*[/])})",