Tout d'abord, vous devez décider ce qui constitue des parenthèses et s'ils peuvent être imbriqués. (pour cette réponse, je vais supposer qu'ils le peuvent). Ensuite, vous devez supprimer ces blocs de parenthèses du texte et les remplacer par un espace réservé :
my @parens;
$str =~ s/( \( (?: (?0)|[^()] )* \) )/push @parens, $1; "PARENS_$#parens"/gex;
Maintenant, il vous reste quelque chose qui ressemble à :
'100% California Grown Olives, Water, Salt And Ferrous Gluconate PAREN_0,asasd,
sadasdas.'
Et il est maintenant facile de le diviser en virgules. Ensuite, sur chacun des éléments divisés, recherchez les jetons PAREN_\d+
, et remplacez-les par ceux du tableau @parens
. Vous devrez peut-être utiliser un nom de espace réservé plus unique en fonction de votre contenu source.
Quelque chose comme :
s/PARENS_(\d+)/$parens[$1]/ge for my @segs = split /,\s*/ => $str;
say for @segs;
qui, pour une chaîne d'exemple :
my $str = "foo (b,a,r), baz (foo, (bar), baz), biz";
affiche :
foo (b,a,r)
baz (foo, (bar), baz)
biz