【问题标题】:Perl split and regular expressionPerl 拆分和正则表达式
【发布时间】:2012-01-18 20:41:07
【问题描述】:

我有以下字符串:

'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

谢谢,

【问题讨论】:

  • 有嵌套括号的可能性吗?如果是这样,正则表达式可能不适合。
  • 不,不可能。只有一对括号,或一对但不嵌套

标签: regex perl split


【解决方案1】:
@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

【讨论】:

    【解决方案2】:

    首先,您需要确定什么是括号,以及它们是否可以嵌套。 (对于这个答案,我会假设他们可以)。然后你需要从文本中删除那些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
    

    【讨论】:

    • 我认为你不需要评估$parens[$1]
    【解决方案3】:

    您可能会发现为要匹配的内容而不是要删除的内容构建正则表达式更容易。 (这假设您不想限制匹配的数量。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多