簡體   English   中英

Perl分裂和正則表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM