匹配Perl正则表达式中的平衡括号

meh*_*aro 6 regex perl perl5.8

我有一个表达式,我需要拆分并存储在一个数组中:

aaa="bbb{ccc}ddd" { aa="bb,cc" { a="b", c="d" } }, aaa="bbb{}" { aa="b}b" }, aaa="bbb,ccc"
Run Code Online (Sandbox Code Playgroud)

一旦拆分并存储在数组中,它应该看起来像这样:

aaa="bbb{ccc}ddd" { aa="bb,cc" { a="b", c="d" } }
aaa="bbb{}" { aa="b}b" }
aaa="bbb,ccc"
Run Code Online (Sandbox Code Playgroud)

我使用Perl版本5.8,有人可以解决这个问题吗?

Eri*_*sty 9

使用perl模块"Regexp :: Common".它有一个很好的平衡括号正则表达式,效果很好.

# ASN.1
use Regexp::Common;
$bp = $RE{balanced}{-parens=>'{}'};
@genes = $l =~ /($bp)/g;
Run Code Online (Sandbox Code Playgroud)


bri*_*foy 8

perlre中有一个例子,使用v5.10中引入的递归正则表达式功能.虽然你被限制在v5.8,但是其他人来这个问题应该得到正确的解决方案:)

$re = qr{ 
            (                                # paren group 1 (full function)
                foo
                (                            # paren group 2 (parens)
                    \(
                        (                    # paren group 3 (contents of parens)
                            (?:
                                (?> [^()]+ ) # Non-parens without backtracking
                                |
                                (?2)         # Recurse to start of paren group 2
                            )*
                        )
                    \)
                )
            )
    }x;
Run Code Online (Sandbox Code Playgroud)


Rez*_*a S 0

尝试这样的事情:

use strict;
use warnings;
use Data::Dumper;

my $exp=<<END;
aaa="bbb{ccc}ddd" { aa="bb,cc" { a="b", c="d" } }     , aaa="bbb{}" { aa="b}b" }, aaa="bbb,ccc"
END

chomp $exp;
my @arr = map { $_ =~ s/^\s*//; $_ =~ s/\s* $//; "$_}"} split('}\s*,',$exp);
print Dumper(\@arr);
Run Code Online (Sandbox Code Playgroud)