Önce parens nelerin karar vermeniz gerekir ve bunlar iç içe eğer. (Bu cevap için, olabileceğini varsayacağım). Şimdi Yani
my @parens;
$str =~ s/(\((?: (?0)|[^()])* \))/push @parens, $1; "PARENS_$#parens"/gex;
sen gibi görünen bir şey kalır: O zaman metinden bu parantez blokları kaldırmak ve bir yer tutucu ile değiştirmek gerekir
'100% California Grown Olives, Water, Salt And Ferrous Gluconate PAREN_0,asasd,
sadasdas.'
Ve bölmek şimdi basittir bu virgülle. Daha sonra, bölünmüş parçaların her birinde PAREN_\d+
belirteçlerini tarayın ve bunları @parens
dizisinden olanlarla değiştirin. Kaynak içeriğinize bağlı olarak daha benzersiz bir yer tutucu adı kullanmanız gerekebilir.
şey gibi:
s/PARENS_(\d+)/$parens[$1]/ge for my @segs = split /,\s*/ => $str;
say for @segs;
bir örnek dize için hangi:
my $str = "foo (b,a,r), baz (foo, (bar), baz), biz";
baskılar:
foo (b,a,r)
baz (foo, (bar), baz)
biz
İç içe geçme parantez olasılığı var mı? Öyleyse, normal ifadeler tasarıya uymayabilir. –
hayır, mümkün değil. sadece tek bir çift parantez veya çift değil ama iç içe değil – snoofkin