我正在尝试使用 Perl 正则表达式在 C 样式代码块之前和之后捕获一些文本。到目前为止,这就是我所拥有的:
use strict;
use warnings;
my $text = << "END";
int max(int x, int y)
{
if (x > y)
{
return x;
}
else
{
return y;
}
}
// more stuff to capture
END
# Regex to match a code block
my $code_block = qr/(?&block)
(?(DEFINE)
(?<block>
\{ # Match opening brace
(?: # Start non-capturing group
[^{}]++ # Match non-brace characters without backtracking
| # or
(?&block) # Recursively match the last captured group
)* # Match 0 or more times
\} # Match closing brace
)
)/x;
# $2 ends up undefined after the match
if ($text =~ m/(.+?)$code_block(.+)/s){
print $1;
print $2;
}
我遇到了第二个捕获组在比赛后没有被初始化的问题。有没有办法在一个DEFINE
块之后继续一个正则表达式?我认为这应该可以正常工作。
$2
应该包含代码块下方的注释,但它没有,我找不到一个很好的理由为什么这不起作用。