Perl分割和正则表达式

5

我有以下字符串:

'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

thanks,


1
有可能出现嵌套的括号吗?如果是这样,正则表达式可能不适用。 - user554546
1
不行,不可能。只能有一个括号对,或者两个但不能嵌套。 - snoofkin
3个回答

12
@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

我认为你不需要评估$parens[$1] - TLP

0
你可能会发现,为想要匹配的内容构建正则表达式比构建要删除的内容更容易。(这假设你不想限制匹配次数。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接