Perl模式匹配“nothing”/空

km0tfn4u  于 2022-12-13  发布在  Perl
关注(0)|答案(1)|浏览(161)

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

sysopen(handle, $filepath, O_RDONLY) or die "WHAT?";
local $/ = undef;
my $filestring = <handle>;

1.我创建了一个名为$regex的模式变量,它是动态生成的,但采用以下格式:

(a)|(b)|(c)

1.我在文本中搜索由空格分隔的模式

while($filestring =~ m/($regex)\s($regex)/g){
   print "Match: $1 $2\n";
   #...more stuff
}

大多数匹配都是有效的,但由于某种原因,我偶尔会得到如下这样的匹配:

Match: and

而正常匹配应该具有如下的两个输出:

Match: , and

有人知道是什么原因吗?
EDIT:模式中似乎匹配了NULL字符。

lpwwtiir

lpwwtiir1#

正则表达式中的每个替代项都是一个单独的捕获组。整个正则表达式如下所示:

((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))

相关问题