结束x /的回溯步骤

时间:2012-06-26 04:09:44

标签: regex

我正在阅读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";
}

2 个答案:

答案 0 :(得分:2)

这是纲要:

  

/ x - 匹配一个/后跟一个x
  ([^ /] | [^ x] /)* - 匹配任何不是/,或不是x后跟斜线的东西 - 尽可能多的次数
   x / - 匹配x后跟/

所以基本上它说:从/x开始,然后匹配x/以外的所有内容,并使用x/结束。

答案 1 :(得分:0)

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