我的作业是“查找包含至少3个零且最多2个1的字符串数”,我的字母表只包含0和1。 我试着这样写:
(if $line =~ /0{3,}/)
但它只给了我3个“顺序”零。
我试过这个:
(if $line =~ /0+0+0+/)
它再次给了我连续的零。
检查所有字符串并查找该字符串中所有零的数量的逻辑是什么,无论它们是否是连续的。
答案 0 :(得分:2)
#match a 0 + anything + 0 + anything + 0, and not (!) 1...1...1
if (($line =~ /0.*0.*0/) && !($line =~ /1.*1.*1/) ) {
$count++;
}
答案 1 :(得分:1)
如果它包含至少三个零,则它包含零,后跟零个或多个字符,后跟零,后跟零个或多个字符,后跟零。
$line =~ /0.*0.*0/s
-or-
$line =~ /^[^0]*0[^0]*0[^0]*0/ # More efficient for strings that don't match.
-or-
$line =~ /^(?:[^0]*0){3}/ # Avoid code repetition
如果它最多包含两个,则不包含至少三个。
$line !~ /^(?:[^1]*1){3}/
所以,
$line =~ /^(?:[^0]*0){3}/ && $line !~ /^(?:[^1]*1){3}/
答案 2 :(得分:0)
这种基于前瞻性的正面正则表达式应该可行:
/^(?=(?:1*0){3})(?=0*(?:10*){0,2}\z)/
答案 3 :(得分:0)
我会算替换,毕竟他们是regexp的一部分,不是吗?
在标量上下文中,s{0}{0}g
将返回替换完成的次数,即字符串中的0的数量。因此,s{0}{0}g >= 3 && s{1}{1}g <=2
将是您正在寻找的条件。
这是一个测试它的小测试程序:
#!/usr/bin/perl
use strict;
use warnings;
use Test::More;
while( <DATA>)
{ chomp;
my( $nb, $expected)= split /\s*=>\s*/;
# the for topicalizes $nb so we don't have to write it in the condition
for ( $nb)
{ my $got= s{0}{0}g >= 3 && s{1}{1}g <=2 ? 'ok' : 'nok';
is( $got, $expected, "testing $nb ($expected)");
}
}
done_testing();
__DATA__
00011 => ok
01010 => ok
1000 => ok
000 => ok
0000 => ok
1100000=> ok
0 => nok
00 => nok
1 => nok
11 => nok
111 => nok
10 => nok
100 => nok
1100 => nok
111000 => nok
010101 => nok