我正在尝试匹配sp { ...{...}... }这样的文本,其中大括号允许嵌套。这就是我到目前为止所知道的:
my $regex = qr/
( #save $1
sp\s+ #start Soar production
( #save $2
\{ #opening brace
[^{}]* #anything but braces
\} #closing brace
| (?1) #or nested braces
)+ #0 or more
)
/x;我就是不能让它与下面的文本匹配:sp { { word } }。有人能看到我的正则表达式出了什么问题吗?
发布于 2012-10-04 11:49:28
这里面有很多问题。递归位应为:
(
(?: \{ (?-1) \}
| [^{}]+
)*
)总而言之:
my $regex = qr/
sp\s+
\{
(
(?: \{ (?-1) \}
| [^{}]++
)*
)
\}
/x;
print "$1\n" if 'sp { { word } }' =~ /($regex)/;发布于 2012-10-04 12:28:04
这是未得到充分利用的Text::Balanced的例子,它是一种非常方便的核心模块。它确实依赖于首先找到/设置的分隔序列开始处的pos,所以我通常这样调用它:
#!/usr/bin/env perl
use strict;
use warnings;
use Text::Balanced 'extract_bracketed';
sub get_bracketed {
my $str = shift;
# seek to beginning of bracket
return undef unless $str =~ /(sp\s+)(?={)/gc;
# store the prefix
my $prefix = $1;
# get everything from the start brace to the matching end brace
my ($bracketed) = extract_bracketed( $str, '{}');
# no closing brace found
return undef unless $bracketed;
# return the whole match
return $prefix . $bracketed;
}
my $str = 'sp { { word } }';
print get_bracketed $str;带有gc修饰符的正则表达式告诉字符串记住匹配的结束点在哪里,extract_bracketed使用该信息知道从哪里开始。
https://stackoverflow.com/questions/12719935
复制相似问题