Regex “如何使用”&引用;作为注释指示符,还没有运算符在语言语法中突出显示?

Regex “如何使用”&引用;作为注释指示符,还没有运算符在语言语法中突出显示?,regex,visual-studio-code,vscode-extensions,tmlanguage,Regex,Visual Studio Code,Vscode Extensions,Tmlanguage,我正在使用VScode并创建自己的语言扩展来突出显示语法,在这里我需要使用正则表达式来查找注释 "comments": { "patterns" [{ "match":"regex1", "name":"comment" }] }, "operator": { "patterns" [{ "match":"regex2", "name":"keyword.operator.NOT" }] }, 基本

我正在使用VScode并创建自己的语言扩展来突出显示语法,在这里我需要使用正则表达式来查找注释

"comments": {
    "patterns" [{
        "match":"regex1",
        "name":"comment"
    }]
},
"operator": {
    "patterns" [{
        "match":"regex2",
        "name":"keyword.operator.NOT"
    }]
},
基本规则是
之后的所有内容
是一个注释,但有一个特殊情况。当<代码>在
eval()
命令中,表示不在

例如,我的一些代码如下所示:

if condition=(eval(!DB_EXIST)) ! this is a comment
(eval( !DB_UPDATED && !DB_EXIST)) !---"!" inside eval() means NOT
!this is another comment
<some commands> ! this is also a comment
我应该使用什么样的正则表达式1和2来显示注释的不同颜色,而不是其他颜色

我不擅长这种延伸写作,所以如果有更好的方法来做这项工作,我将非常感谢听到。 谢谢

更新

@Gama11帮助了我,但我没有在代码示例中完全涵盖所有情况。
只要“!”不在eval()内,则“!”之后的任何非sapce也应为注释

这里有一种方法:

{
“$schema”:”https://raw.githubusercontent.com/Septh/tmlanguage/master/tmLanguage.schema.json",
“scopeName”:“source.abc”,
“模式”:[
{
“开始”:(eval)\\(“,
“结束”:“\\)”,
“捕获”:{
"1": {
“名称”:“实体.名称.函数”
}
},
“模式”:[
{
“包括”:“#parens”
},
{
“匹配”:“!”,
“名称”:“关键字”
}
]
},
{
“匹配”:“!*?$”,
“名称”:“注释”
}
],
“存储库”:{
“帕伦斯”:{
“开始”:“\\(”,
“结束”:“\\)”,
“模式”:[
{
“包括”:“#parens”
}
]
}
}
}

我们为非注释
设置了模式首先,因为它更具体,应该优先于另一个。另外,我使用了
“keyword”
范围,而不是更合适的
“keyword.operator.NOT”
,因此它实际上在屏幕截图中显示了不同的颜色

第一个正则表达式是
begin
-
end
模式,它允许我们仅对这两个匹配项之间的文本应用模式(在本例中是在
eval()
calll中)。在这里,我们不妨突出显示
eval
作为一个具有
entity.name.function
作用域的函数

如果我们在
eval()
中,我们允许两种模式:

  • 一个递归的
    begin
    -
    end
    模式(包括它本身)来平衡括号(你可能会有类似
    eval(foo()+!bar())
    ,而
    foo()
    中的
    不应该结束
    eval
    -模式)
  • 我们首先感兴趣的运算符
第二个正则表达式只匹配
,然后是任何东西(
*?
),直到行尾(
$


总的来说,我强烈建议使用一个工具,比如用来处理TM语法文件的正则表达式。比在VSCode中迭代要容易得多,因为您可以获得即时反馈。

哇,我想这正是我想要的!你太棒了!我从中学到了很多,尤其是这个递归模式。它真的很有用。谢谢