2011-12-12 24 views
5

Aşağıdaki dizesi vardır: Ben /,/ bunu bölmek ancak sadece eğer onun iç parantez Örneğin, bu durumda sonucu olmalıdır etmemeye çalışırkenPerl bölünmüş ve düzenli ifade

'100% California Grown Olives, Water, Salt And Ferrous Gluconate (An,Iron, Derivative),asasd, sadasda' 

:

100% California Grown Olives 
Water 
Salt And Ferrous Gluconate (An,Iron, Derivative) 
asasd 
sadasda 

sayesinde

+1

İç içe geçme parantez olasılığı var mı? Öyleyse, normal ifadeler tasarıya uymayabilir. –

+1

hayır, mümkün değil. sadece tek bir çift parantez veya çift değil ama iç içe değil – snoofkin

cevap

11
@result = split(m/,(?![^()]*\))/, $subject); 

T Sadece sonraki sonraki parantez (eğer varsa) kapanış parantezi değilse, virgülle ayrılır. Jack Maney doğru bir şekilde belirttiği gibi, yuvalanmış parantezlerin ortaya çıkması durumunda bu başarısızlığa yol açabilir.

Açıklama:

,  # Match a comma. 
(?!  # Assert that it's impossible to match... 
[^()]* # any number of non-parenthesis characters 
\)  # followed by a closing parenthesis 
)  # End of lookahead assertion 
1

Ö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 
+0

"$ parens [$ 1]" değerini değerlendirmeniz gerektiğini düşünmüyorum. – TLP

0

Bunu daha kolay etmek istediğini için regexpi inşa etmek bulabilir Kaldırmak istediğinizi değil, eşleştirin. (Bu, eşleşme sayısını sınırlamak istemediğinizi varsayar.)