如何使用缩进捕获字符串组?

时间:2015-09-15 18:20:34

标签: c# regex string

我想将此字符串中的每个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

2 个答案:

答案 0 :(得分:3)

您可以使用这个基于前瞻性的正则表达式:

^(\s*if[\s\S]+?)(?=^\s*if|\z)

MULTILINE模式。

RegEx Demo

[\s\S]+将匹配另外一个字符,包括换行符(?=^\s*if|\z)是一个先行,将确保断言当前匹配旁边是另一个if块或输入结束。

答案 1 :(得分:1)

无论你想做什么,都应该考虑编写一个解析器。从长远来看,它会让事情变得简单。

如果你坚持使用正则表达式,那么......

^([ ]*)if.+\r?\n(\1[ ]+).+(?:\r?\n\2(?!if).+)*

Demo

用法:

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之后的第一行。