我正在为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*
部分。您应该可以进行var:=value
或var := value
或:=
和value
之间的任意数量的空格,无论多少都可以。 但是,当我尝试使用它时,会得到 this :
variableName :=thisHighlightsProperly;
variableName := thisFails;
我也只尝试了\\s
和\\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
答案 0 :(得分:0)
因此,感谢@ Gama11,我得以弄清问题所在。另一个模式正在干扰第一个模式,但这种方式对我而言并不明显。
有问题的模式应作为变量赋值(实际上是赋值)的结尾部分,因此在使用函数或字符串(按预期)时不适用。它仅应适用于将数字和其他变量的值分配给所讨论的变量。变量分配的开始部分(获取变量名称并为其分配一些内容)是通过一个单独的块完成的。
乍看之下,我认为这不是问题,因为已经包含另一种与var_assign
相匹配的模式(:=
)。带有begin_variable_assignment
模式的问题是与\\:\\=\\s*
匹配的。后面的\\s*
是问题所在。删除后,该问题将再次出现。
简而言之,以下不同模式的比赛都可以和平共处:
":="
"^\\s*(\\w+)\\s*(\\:\\=)"
"(?<=:=)\\s*(\\w+)(;|,)$"
但这将不兼容:
"^\\s*(\\w+)\\s*(\\:\\=)\\s*"
所有这些纯粹是通过观察/测试。显然,问题在于重叠,可能是长度可变的匹配。