我正在尝试匹配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 } }
。任何人都可以看到我的正则表达式有什么问题吗?
答案 0 :(得分:6)
有很多问题。递归位应为:
(
(?: \{ (?-1) \}
| [^{}]+
)*
)
所有在一起:
my $regex = qr/
sp\s+
\{
(
(?: \{ (?-1) \}
| [^{}]++
)*
)
\}
/x;
print "$1\n" if 'sp { { word } }' =~ /($regex)/;
答案 1 :(得分:5)
这是未充分利用的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
使用该信息知道从哪里开始。