我正在为 VSCode 开发自定义语言语法突出显示扩展。我遇到了一个问题,当在空格旁边使用时,lookbehinds 的行为很奇怪。
我要强调的代码示例:
variableName :=thisValueShouldHighlight;
variableName := thisValueShouldHighlight;
variableName := thisValueShouldAlsoHighlight,
我尝试使用的代码示例(在tpl.tmLanguage.json
):
"end_variable_assignment": {
"comment": "Covers ending assignment of a value to a variable. IN PROGRESS",
"match": "(?<=:=)\\s*(\\w+)(;|,)$",
"name": "punctuation.accessor.tpl",
"captures": {
"1": {
"name": "entity.name.type.tpl"
},
"2": {
"name": "punctuation.accessor.tpl"
}
}
}
此模式包含在(在另一个模式中,它存在于整个文件中):
{
"include": "#end_variable_assignment"
}
症结是\\s*
正则表达式的一部分。您应该能够在 and 之间使用orvar:=value
或var := value
任意数量的空格,不管有多少。但是,当我尝试使用它时,我得到了这个::=
value
variableName :=thisHighlightsProperly;
variableName := thisFails;
我也尝试过\\s
and \\s+
,但都没有工作。我尝试了一些愚蠢的例子来确保我的逻辑通过使用一些占位符来工作,比如(?<=:=)#(\\w+)...
,然后用 测试它var:=#value
,它确实有效......但它从不适用于空格。
我不明白为什么这是一个问题,因为我在\\s*
其他地方使用过没有任何问题(只是不同的情况)。我不相信这是一个属性问题,因为它适用于除空白之外的所有内容。
附加信息:我在 RegexCoach 和 Regex101.com 上对此进行了测试,它在那里工作。
出于测试目的,我还包含了应在此处突出显示的代码的测试示例:https ://drive.google.com/open?id=1yoDXVxW3LFYjejW1wps8ENWUQ4iCal9w
这是我可以提供的代码的最小示例:
tpl 1.15 module Pattern_Module_Name;
pattern Pattern_name 1.0
triggers
on si := SoftwareInstace created, confirmed where name matches "(?i)SomeRegex";
end triggers;
body
// RE: STACKOVERFLOW PROBLEM
// As you can see, these aren't highlighting properly
var_name :=thisShouldHighlight;
var_name := thisShouldHighlightButDoesnt;
var_name := thisShouldHighlightButDoesnt,
end body;
end pattern;
我的所有自定义语言代码都可以在我的 GitHub 上找到:https ://github.com/cdpautsch/vscode-tpl