我正在阅读Jeffrey Friedl的着作Mastering Regular Expressions 3rd Ed。在页274,Jeffrey要求他的读者调查为什么正则表达式 / x([^ /] | [^ x] /)* x / 匹配字符串(以粗体标记的匹配字符)“years =天 / 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";
}
答案 0 :(得分:2)
这是纲要:
/ x - 匹配一个/后跟一个x
([^ /] | [^ x] /)* - 匹配任何不是/,或不是x后跟斜线的东西 - 尽可能多的次数
x / - 匹配x后跟/
所以基本上它说:从/x
开始,然后匹配x/
以外的所有内容,并使用x/
结束。
答案 1 :(得分:0)
我明白了。约瑟夫是对的。当第二个“/ x”的匹配失败时,正则表达式引擎回溯到“/ x”以尝试并且它成功。