Perl中的正则表达式

时间:2013-10-04 13:06:57

标签: regex perl

我的作业是“查找包含至少3个零且最多2个1的字符串数”,我的字母表只包含0和1。 我试着这样写:

(if $line =~ /0{3,}/)

但它只给了我3个“顺序”零。

我试过这个:

(if $line =~ /0+0+0+/) 

它再次给了我连续的零。

检查所有字符串并查找该字符串中所有零的数量的逻辑是什么,无论它们是否是连续的。

4 个答案:

答案 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