我想将此字符串中的每个if-construct捕获为单个
if a > b
do this
do that
if a == c
do this
do that
我想要匹配
if a > b
do this
do that
和
if a == c
do this
do that
到目前为止,我没有在新的if-constructs之间分开
if(\W+\w+)+\n\t
答案 0 :(得分:3)
您可以使用这个基于前瞻性的正则表达式:
^(\s*if[\s\S]+?)(?=^\s*if|\z)
以MULTILINE
模式。
[\s\S]+
将匹配另外一个字符,包括换行符,(?=^\s*if|\z)
是一个先行,将确保断言当前匹配旁边是另一个if
块或输入结束。
答案 1 :(得分:1)
无论你想做什么,都应该考虑编写一个解析器。从长远来看,它会让事情变得简单。
如果你坚持使用正则表达式,那么......
^([ ]*)if.+\r?\n(\1[ ]+).+(?:\r?\n\2(?!if).+)*
用法:
var re = new Regex(@"^([ ]*)if.+\r?\n(\1[ ]+).+(?:\r?\n\2(?!if).+)*", RegexOptions.Multiline);
让我们把它分成几部分:
^([ ]*)if.+\r?\n
捕获带有前导空格的第一个if
,直到换行(\1[ ]+).+
捕获下一行。它需要更多空格(因此它是缩进的)。(?:\r?\n\2(?!if).+)*
会抓住下一行直到下一行if
。它需要相同的空格量,而不是if
之后的第一行。