En primer lugar, debe decidir lo que constituye parens, y si se pueden anidar. (para esta respuesta, asumiré que pueden ser). Luego hay que eliminar esos bloques paren a partir del texto y reemplazarlo con un marcador de posición:
my @parens;
$str =~ s/(\((?: (?0)|[^()])* \))/push @parens, $1; "PARENS_$#parens"/gex;
Así que ahora lo que queda es algo que se parece:
'100% California Grown Olives, Water, Salt And Ferrous Gluconate PAREN_0,asasd,
sadasdas.'
y es simple ahora para dividir en comas. Luego, en cada una de las piezas divididas, escanee tokens PAREN_\d+
y reemplácelos con los del conjunto @parens
. Es posible que necesite utilizar un nombre de marcador de posición más único en función de su contenido fuente.
Algo así como:
s/PARENS_(\d+)/$parens[$1]/ge for my @segs = split /,\s*/ => $str;
say for @segs;
que, por ejemplo cadena:
my $str = "foo (b,a,r), baz (foo, (bar), baz), biz";
impresiones:
foo (b,a,r)
baz (foo, (bar), baz)
biz
¿Existe la posibilidad de paréntesis anidados? Si es así, es posible que las expresiones regulares no se ajusten a la factura. –
no, no es posible. solo par único de paréntesis, o pareja pero NO anidado – snoofkin