1

这让我发疯!

  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
    }
    

大多数匹配都是有效的,但由于某种原因,我每隔一段时间就会得到如下匹配:

Match: and 

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

Match: , and

有谁知道这可能是什么原因造成的?

编辑:看起来 NULL 字符正在模式中匹配。

4

1 回答 1

6

正则表达式中的每个替代项都是一个单独的捕获组。整个正则表达式看起来像:

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

我已经用每条正则表达式的捕获组号对其进行了注释。

所以如果$filestringb a$1将是b$2将是空的尝试,因为没有匹配(a)

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

((?:a)|(?:b)|(?:c))\s((?:a)|(?:b)|(?:c))
于 2012-11-21T23:01:38.313 回答