Najpierw trzeba zdecydować, co stanowi parens, a jeżeli mogą być zagnieżdżone. (dla tej odpowiedzi założę, że mogą być). Następnie trzeba usunąć te PAREN bloki z tekstem i wymienić go na zastępczy:
my @parens;
$str =~ s/(\((?: (?0)|[^()])* \))/push @parens, $1; "PARENS_$#parens"/gex;
Więc teraz pozostaje ci coś, co wygląda jak:
'100% California Grown Olives, Water, Salt And Ferrous Gluconate PAREN_0,asasd,
sadasdas.'
I to jest proste teraz podzielić to na przecinkach. Następnie na każdym z podzielonych kawałków, przeskanuj tokenów PAREN_\d+
i zamień je na te z tablicy @parens
. Może być konieczne użycie bardziej unikalnej nazwy elementu zastępczego w zależności od zawartości źródłowej.
Coś jak:
s/PARENS_(\d+)/$parens[$1]/ge for my @segs = split /,\s*/ => $str;
say for @segs;
które na przykład wyrażenie:
my $str = "foo (b,a,r), baz (foo, (bar), baz), biz";
nadrukami:
foo (b,a,r)
baz (foo, (bar), baz)
biz
Czy istnieje możliwość zagnieżdżania nawiasów? Jeśli tak, to regexes może nie pasować do rachunku. –
nie, niemożliwe. tylko jedna para nawiasów lub para, ale NIE zagnieżdżona – snoofkin