[英]Regex with recursive expression to match nested braces?
我正在嘗試匹配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 } }
。 任何人都可以看到我的正則表達式有什么問題嗎?
有很多問題。 遞歸位應該是:
(
(?: \{ (?-1) \}
| [^{}]+
)*
)
全部一起:
my $regex = qr/
sp\s+
\{
(
(?: \{ (?-1) \}
| [^{}]++
)*
)
\}
/x;
print "$1\n" if 'sp { { word } }' =~ /($regex)/;
對於未充分利用的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
使用該信息來知道從哪里開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.