正则表达式:匹配非嵌套代码块

时间:2014-05-31 00:34:35

标签: regex nested match

我目前正在写一个小文本。有了这个texteditor,用户就可以为一个非常简单的脚本引擎创建小脚本。

为了更好地概述,我想用GoTo(x,y)或Draw(x,y)等相同命令突出显示代码块。

为了达到这个目的,我想使用Regular Expresions(我已经用它来突出显示变量等其他内容)

这是我的表达(我知道它非常难看):

/(?<!GoTo|Draw|Example)(^(?:GoTo|Draw|Example)\(.+\)*?$)+(?!GoTo|Draw|Example)/gm

“逻辑”:

  • (?&lt;!GoTo | Draw | Example):负面观察。之前的行中没有GoTo / Draw / Example命令(插入空格以避免渲染问题)
  • (^(?:GoTo | Draw | Example)(。+)*?$)现在使用GoTo / Draw / Example(直到行结束(甚至匹配评论)
  • “+”找到最后一个模式min。一次
  • 下一行中的UNTIL不包含GoTo / Draw / Example(负向前瞻)

(在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。

1 个答案:

答案 0 :(得分:0)

您正在寻找的表达式是

((?:^GoTo.+\n?)+)|((?:Draw.+\n?)+)

您可以在工作中看到这一点here

这里的关键是使用\n匹配“包括行尾的所有内容”,以便您可以跨多行匹配。还要注意使用?:来获取非捕获内部组(这是重复的),因此我们不会最终得到内部和外部匹配(我们只希望“整个块”匹配)。最后,|将整个Draw块与GoTo的整个块分开。显然,如果您有其他关键字,也可以重复这些关键字。