【问题标题】:How to apply two conditions to a split?如何将两个条件应用于拆分?
【发布时间】:2014-08-16 13:09:00
【问题描述】:

我想拆分字母“b”而不将其从输出中删除。如果后面没有“c”,我只想拆分“b”。我怎样才能结合这两个条件?到目前为止,这是我尝试过的:

$val ="abbcdebffgbhiabbbcde";
@as = split(/(?<=b)/,"$val",) if !~/(bc)/g; 
foreach (@as){
    print "$_\n";
}

这是我的预期输出:

ab
bcdeb #here 'b' present but not split because succeeding 'c' is present.
ffgb
hiab
b
bcde #here 'b' present but not split because succeeding 'c' is present.

目前,我的代码拆分为所有“b”。如何更改它以结合这两个条件?

【问题讨论】:

  • 我注意到您没有接受任何问题的答案。不要忘记为您认为有用的答案投票,如果您的问题得到解决,请接受您最喜欢的答案。
  • 谢谢@Tom Fenech。我明白了。进一步我会投票给接受的答案。
  • 没问题。除了投票,您还应该点击您最喜欢的答案旁边的 ✔。这会将其标记为已接受。你应该对所有问题都这样做。谢谢。

标签: perl split


【解决方案1】:

你想要一个否定的前瞻断言

use strict;
use warnings;

my $val = "abbcdebffgbhiabbbcde";
my @as = split(/(?<=b)(?!c)/, $val);

print "$_\n" foreach @as;

只要它后面没有“c”,它就会在前面有字母“b”的任何点上分割。 (?!c) 是一个否定的前瞻断言,这意味着任何“b”后跟“c”都不会匹配。

输出:

ab
bcdeb
ffgb
hiab
b
bcde

【讨论】:

    【解决方案2】:

    使用我之前对您问题的回答的细微变化:

    $data = "abbcdebffgbhiabbbcde";
    
    while ($data =~ /b[^c]/g) {
        print substr($data, 0, $+[0]-1, "") . "\n";
    }
    print $data,"\n";
    

    输出:

    ab
    bcdeb
    ffgb
    hiab
    b
    bcde
    

    【讨论】:

      猜你喜欢
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多