2011-12-12 132 views
5

我有以下字符串:Perl的分裂和正則表達式

'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 

感謝,

+1

是否有嵌套括號的可能性?如果是這樣,正則表達式可能不適合該法案。 – 2011-12-12 21:53:06

+1

不可能。只有一對括號,或一對但不嵌套 – snoofkin

回答

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

ŧ只有在下一個括號(如果有)不是右括號時,他纔會以逗號分割。正如Jack Maney正確指出的那樣,如果嵌套括號可能會發生,這可能會導致失敗。

說明:

,  # 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

首先,你需要決定什麼是括號,如果他們可以被嵌套。 (對於這個答案,我會假設他們可以)。然後,你需要從文本中刪除這些括號塊和一個佔位符代替它:

my @parens; 
$str =~ s/(\((?: (?0)|[^()])* \))/push @parens, $1; "PARENS_$#parens"/gex; 

所以,現在你留下的東西,看起來像:

'100% California Grown Olives, Water, Salt And Ferrous Gluconate PAREN_0,asasd, 
sadasdas.' 

而且它現在簡單拆分它在逗號。然後在每個分割片上掃描PAREN_\d+標記,並將其替換爲@parens陣列中的標記。您可能需要使用更獨特的佔位符名稱,具體取決於您的源內容。

喜歡的東西:

s/PARENS_(\d+)/$parens[$1]/ge for my @segs = split /,\s*/ => $str; 

say for @segs; 

這對於一個例子字符串:

my $str = "foo (b,a,r), baz (foo, (bar), baz), biz"; 

打印:

foo (b,a,r) 
baz (foo, (bar), baz) 
biz 
+0

我不認爲你需要評估'$ parens [$ 1]'。 – TLP

0

您可能會發現更容易建立一個正則表達式爲你想要什麼匹配,而不是你想要刪除的內容。 (這裏假設你不想限制匹配次數。)