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