如何将两个条件应用于拆分?

时间:2014-08-16 13:09:01

标签: perl split

我想拆分字母“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”上分裂。如何更改它以结合这两个条件?

2 个答案:

答案 0 :(得分:7)

你想要一个否定先行断言

use strict;
use warnings;

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

print "$_\n" foreach @as;

这会在字母&#34; b&#34;之前的任何点上分开,只要它后面没有&#34; c&#34;。 (?!c)是一个负面的先行断言,这意味着任何&#34; b&#34;然后是&#34; c&#34;不会匹配。

输出:

ab
bcdeb
ffgb
hiab
b
bcde

答案 1 :(得分:3)

使用我之前对您的问题的回答略有不同:

$data = "abbcdebffgbhiabbbcde";

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

输出:

ab
bcdeb
ffgb
hiab
b
bcde