In primo luogo è necessario decidere ciò che costituisce parentesi, e se possono essere nidificate. (per questa risposta, supporrò che possano esserlo). Poi è necessario rimuovere i blocchi paren dal testo e sostituirlo con un segnaposto:
my @parens;
$str =~ s/(\((?: (?0)|[^()])* \))/push @parens, $1; "PARENS_$#parens"/gex;
Così ora si sono lasciati con qualcosa che assomiglia a:
'100% California Grown Olives, Water, Salt And Ferrous Gluconate PAREN_0,asasd,
sadasdas.'
ed è semplice ora di dividere su virgole. Quindi, su ciascuno dei pezzi divisi, cerca i token PAREN_\d+
e sostituiscili con quelli dell'array @parens
. Potrebbe essere necessario utilizzare un nome segnaposto più esclusivo in base al contenuto sorgente.
Qualcosa di simile:
s/PARENS_(\d+)/$parens[$1]/ge for my @segs = split /,\s*/ => $str;
say for @segs;
che per una stringa di esempio
my $str = "foo (b,a,r), baz (foo, (bar), baz), biz";
stampe:
foo (b,a,r)
baz (foo, (bar), baz)
biz
fonte
2011-12-12 21:56:24
Esiste una possibilità di parentesi nidificate? In tal caso, le espressioni rege potrebbero non essere adatte alla bolletta. –
no, non è possibile. solo una coppia di parentesi, o coppia ma NON annidata – snoofkin