全局g正则表达式标志的奇怪行为

时间:2014-01-06 10:56:51

标签: regex perl global

my $test = "There was once an\n ugly ducking";
if ($test =~ m/ugly/g) {
    if ($test =~ m/here/g) {
        print 'Match';
    }
}

没有输出结果,但是

my $test = "There was once an\n ugly ducking";
if ($test =~ m/here/g) {
    if ($test =~ m/ugly/g) {
        print 'Match';
    }
}

导致匹配!

如果我从正则表达式中删除g标志,那么第二次内部测试会匹配在$ test中出现的匹配项。我找不到为什么会这样的参考。

1 个答案:

答案 0 :(得分:9)

是。该行为记录在perlop手册页中。使用带有m/.../标记的g在字符串中前进以进行下一场比赛。

  

在标量上下文中,每次执行“m // g”都会找到下一个匹配项,如果匹配则返回true,如果没有进一步匹配则返回false。可以使用“pos()”函数读取或设置最后一次匹配后的位置;在perlfunc中看到“pos”。失败的匹配通常会重置搜索位置                  到字符串的开头,但你可以通过添加“/ c”修饰符(例如“m // gc”)来避免这种情况。修改目标字符串也会重置搜索位置。

因此,在ugly之后的第一种情况下,没有任何here子字符串,但在第二种情况下,它首先与here中的There匹配,之后它会找到{ {1}}字。