Perl模式匹配“无”/空

时间:2012-11-21 22:33:03

标签: regex perl pattern-matching

这让我疯了!

  1. 我将一个txt文件读入一个名为$ filestring的字符串中。

    sysopen(handle, $filepath, O_RDONLY) or die "WHAT?";
    local $/ = undef;
    my $filestring = <handle>;
    
  2. 我创建了一个名为$ regex的模式变量,它是动态生成的,但采用以下格式:

    (a)|(b)|(c)
    
  3. 我在文本中搜索由空格分隔的图案

    while($filestring =~ m/($regex)\s($regex)/g){
       print "Match: $1 $2\n";
       #...more stuff
    }
    
  4. 大多数比赛都是有效的,但出于某种原因,我每隔一段时间就得到一次如下比赛:

    Match: and 
    

    而正常匹配应该有两个输出,如下所示:

    Match: , and
    

    有谁知道可能导致这种情况的原因?

    编辑:似乎在模式中匹配NULL字符。

1 个答案:

答案 0 :(得分:5)

正则表达式中的每个备选方案都是一个单独的捕获组。整个正则表达式如下:

((a)|(b)|(c))\s((a)|(b)|(c))
12   3   4     56   7   8

我已用每个正则表达式的捕获组编号标注它。

因此,如果$filestringb a$1将为b,则$2将为空{s},因为没有匹配(a)。< / p>

为避免这种情况,您应该使用非捕获组作为替代方案:

((?:a)|(?:b)|(?:c))\s((?:a)|(?:b)|(?:c))