我试图创建一个正则表达式,它捕获一个命名组,然后在该命名组内查看它是否包含某些特性。
例如我有一个与代码块匹配的正则表达式,我可以使用它来匹配和捕获代码块:
use strict;
use warnings;
my $text = <<'END_TEXT';
block {
// random stuff
}
block {
dog
}
END_TEXT
my $code_block_rx = qr{(?(DEFINE)
(?<code_block>
block\h\{ (?: [^{}]++ | (?&code_block) )*+ \}
)
)}xms;
while ($text =~ m/(?<match>(?&code_block))$code_block_rx/g) {
print $+{match}."\n";
}
此代码将打印两个代码块。但是,如果我只想捕获包含单词“dog”的代码块呢?
是否有方法(在单个正则表达式中)捕获代码块,然后如果找到,在代码块内查找单词“dog”?
我尝试修改正则表达式以使用前瞻断言,但它只会导致整个操作失败:
/(?<match>(?=dog)(?&code_block))$code_block_rx/g