这让我疯了!
我将一个txt文件读入一个名为$ filestring的字符串中。
sysopen(handle, $filepath, O_RDONLY) or die "WHAT?";
local $/ = undef;
my $filestring = <handle>;
我创建了一个名为$ regex的模式变量,它是动态生成的,但采用以下格式:
(a)|(b)|(c)
我在文本中搜索由空格分隔的图案
while($filestring =~ m/($regex)\s($regex)/g){
print "Match: $1 $2\n";
#...more stuff
}
大多数比赛都是有效的,但出于某种原因,我每隔一段时间就得到一次如下比赛:
Match: and
而正常匹配应该有两个输出,如下所示:
Match: , and
有谁知道可能导致这种情况的原因?
编辑:似乎在模式中匹配NULL字符。
答案 0 :(得分:5)
正则表达式中的每个备选方案都是一个单独的捕获组。整个正则表达式如下:
((a)|(b)|(c))\s((a)|(b)|(c))
12 3 4 56 7 8
我已用每个正则表达式的捕获组编号标注它。
因此,如果$filestring
为b a
,$1
将为b
,则$2
将为空{s},因为没有匹配(a)
。< / p>
为避免这种情况,您应该使用非捕获组作为替代方案:
((?:a)|(?:b)|(?:c))\s((?:a)|(?:b)|(?:c))