如何捕获带缩进的字符串组

本文关键字:字符串 缩进 何捕获 | 更新日期: 2023-09-27 18:12:47

我想捕获这个字符串中的每个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结构分开

if('W+'w+)+'n't

如何捕获带缩进的字符串组

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

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

in MULTILINE mode.

RegEx演示

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

无论您想做什么,都应该考虑编写一个解析器。从长远来看,这将使事情更简单。

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

^([ ]*)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后的第一行相同的空格量。