我目前正在写一个小文本。有了这个texteditor,用户就可以为一个非常简单的脚本引擎创建小脚本。
为了更好地概述,我想用GoTo(x,y)或Draw(x,y)等相同命令突出显示代码块。
为了达到这个目的,我想使用Regular Expresions(我已经用它来突出显示变量等其他内容)
这是我的表达(我知道它非常难看):
/(?<!GoTo|Draw|Example)(^(?:GoTo|Draw|Example)\(.+\)*?$)+(?!GoTo|Draw|Example)/gm
“逻辑”:
(在regex101.com上进行测试,最后我需要这个用于vb.net) 它匹配以下内容:
-Code- -result- execpted result
GoTo(5656) -> MATCH 1 -> MATCH 1
sdsd
GoTo(sdsd) --comment -> MATCH 2 -> MATCH 2
GoTo(23329); -> MATCH 3 -> MATCH 2
Test()
GoTo(12) -> MATCH 4 -> MATCH 3
LALA
Draw(23) -> MATCH 5 -> MATCH 4
Draw(24) -> MATCH 6 -> MATCH 4
Draw(25) -> MATCH 7 -> MATCH 4
但我想要实现的是,相同命令的完整“块”是匹配的。在这种情况下,比赛2&amp; 4和比赛5&amp; 6&amp; 7应该是一场比赛。
图片:组示例:
使用http://regex101.com/进行测试,编程语言为vb.net。
答案 0 :(得分:0)
您正在寻找的表达式是
((?:^GoTo.+\n?)+)|((?:Draw.+\n?)+)
您可以在工作中看到这一点here
这里的关键是使用\n
匹配“包括行尾的所有内容”,以便您可以跨多行匹配。还要注意使用?:
来获取非捕获内部组(这是重复的),因此我们不会最终得到内部和外部匹配(我们只希望“整个块”匹配)。最后,|
将整个Draw
块与GoTo
的整个块分开。显然,如果您有其他关键字,也可以重复这些关键字。