0

我正在阅读 Jeffrey Friedl 的《Mastering Regular Expressions 3rd Ed》一书。在第 274 页,Jeffrey 要求他的读者调查为什么正则表达式/x([^/]|[^x]/)*x/匹配字符串(匹配的字符以粗体标记)“years = days /x 除 x// 365; /x 假设为非闰年 x/ "。

我从正则表达式中删除了结尾的x/。所以正则表达式/x([^/]|[^x]/)*的输出是"/x 除 x//365; "。但是在我添加x/后,正则表达式/x([^/]|[^x]/)*x/的输出是“/x 除 x//365;/x 假设非闰年 x/” .

谁能告诉我 Perl 的正则表达式引擎对结尾x/的回溯步骤?

这是我针对这个问题的 perl 脚本。

my $str = "years = days /x divide x//365; /x assume non-leap year x/";
if ($str =~ m{(/x([^/]|[^x]/)*)}) {
    print "\$1: '$1'\n"; # output: $1: '/x divide x//365; '
} else {
    print "not matched.\n";
}


$str = "years = days /x divide x//365; /x assume non-leap year x/";
if ($str =~ m{(/x([^/]|[^x]/)*x/)}) {
    print "\$1: '$1'\n"; # output: $1: '/x divide x//365; /x assume non-leap year x/'
} else {
    print "not matched.\n";
}
4

2 回答 2

2

这是纲要:

/x - 匹配 / 后跟 x
([^/]|[^x]/)* - 匹配任何不是 / 或不是 x 后跟斜杠的内容 - 尽可能多地匹配
x/ -匹配一个 x 后跟一个 /

所以基本上它说:从 开始/x,然后匹配除之外的所有内容x/,并以 . 结尾x/

于 2012-06-26T04:20:05.040 回答
0

我得到了它。约瑟夫是对的。当第二个“/x”匹配失败时,正则表达式引擎回溯到“/x”尝试并成功。

于 2012-06-27T00:51:41.400 回答