[英]Perl split and regular expression
我有以下字符串:
'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
謝謝,
@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
首先,你需要決定什么是parens,以及它們是否可以嵌套。 (對於這個答案,我會假設他們可以)。 然后,您需要從文本中刪除這些paren塊並將其替換為占位符:
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
您可能會發現為要匹配的內容構建正則表達式更容易,而不是要刪除的內容。 (這假設您不希望限制匹配數。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.