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