Regex “如何使用”&引用;作为注释指示符,还没有运算符在语言语法中突出显示?
我正在使用VScode并创建自己的语言扩展来突出显示语法,在这里我需要使用正则表达式来查找注释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" }] }, 基本
"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中迭代要容易得多,因为您可以获得即时反馈。哇,我想这正是我想要的!你太棒了!我从中学到了很多,尤其是这个递归模式。它真的很有用。谢谢