正则表达式 perl 抓取文本块

Regular expression perl grab block of text

Something () {
  X {
    block of text
  }
  Y{
    block of text
  }
  Z{
     block of text
  }
}

我正在逐行阅读,我想获取从 'Something' 到最后一个 '{'

的文本块

我正在使用如下正则表达式

/某事{/../}/

但它会得到直到:

Something {
  X {
    block of text
  }

谁能帮我用正则表达式抓取整个文本块?

您似乎只需要没有前导的行 space,即

/^Something {/ .. /^}/

您可以为此使用递归子模式:

/Something \s* ( { (?: [^{}]* | (?-1) )* } )/x

RegEx Demo

但是请记住,它不适用于转义的花括号,如果你有不平衡的括号,它会中断。

Regexp::Common可以匹配平衡括号,

use strict;
use warnings;

use Regexp::Common;

my $re = $RE{balanced}{-parens=>'{}'};
my $s = q[
Something {
  X {
    block of text
  }
  Y{
    block of text
  }
  Z{
     block of text
  }
}
];
print "\n" if $s =~ /(Something\s+$re)/;

输出

Something {
  X {
    block of text
  }
  Y{
    block of text
  }
  Z{
     block of text
  }
}