Perl模式匹配"无"/空

Leb*_*156 1 regex perl pattern-matching

这让我疯了!

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

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

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

    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字符.

Bar*_*mar 5

regexp中的每个备选项都是一个单独的捕获组.整个正则表达式如下:

((a)|(b)|(c))\s((a)|(b)|(c))
12   3   4     56   7   8
Run Code Online (Sandbox Code Playgroud)

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

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

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

((?:a)|(?:b)|(?:c))\s((?:a)|(?:b)|(?:c))
Run Code Online (Sandbox Code Playgroud)