Perl目前(5.8和5.10)是否会对订单变更作出任何承诺?

时间:2009-04-20 00:18:17

标签: regex perl

考虑到像/(foo|foobar|foobaz)/这样的替换,Perl 5.8或5.10会做出关于三个中哪一个将首先被使用的任何承诺,如果它在文档的哪个地方做了它会做出这个承诺?

请参阅相关问题Does Perl 6 make any promises about the order alternations will be used?

3 个答案:

答案 0 :(得分:4)

http://perldoc.perl.org/perlre.html#Combining-RE-Pieces

  

如果我们将正则表达式a | ab与“abc”匹配,它是否匹配子字符串“a”或“ab”?描述哪个子串实际匹配的一种方法是回溯的概念(参见“回溯”)。但是,这种描述太低级,使您无法考虑特定的实现。

     

另一种描述始于“更好”/“更糟糕”的概念

     

同样,对于基本部分,没有这样的问题,因为在给定位置处最多一次匹配是可能的。本节描述了组合运算符的更好/更差的概念。在下面的描述中,S和T是常规子表达式。

     

...

     
      
  • S | T
  •   
     

当S匹配时,它比只有T匹配时更好。

(在上下文中,只有当使用S的匹配在字符串中与使用S的匹配最少匹配时,才符合此条件。)

答案 1 :(得分:3)

似乎在perldoc perlrequick中做出了承诺:

  

要匹配dogcat,我们会形成正则表达式dog|cat。和以前一样,perl会尝试在字符串中尽可能早地匹配正则表达式。在每个角色位置,perl将首先尝试匹配第一个替代dog。如果dog不匹配,perl将尝试下一个替代cat。如果cat也不匹配,则匹配失败,perl移动到字符串中的下一个位置。

perldoc perlretut似乎以更强的方式做出承诺(但有一点需要注意):

"cats"          =~ /c|ca|cat|cats/; # matches "c"
"cats"          =~ /cats|cat|ca|c/; # matches "cats"
  

这里,所有替代方案都匹配第一个字符串位置,因此第一个替代方案是匹配的方案。如果某些替代方案是其他方案的截断,请先填写最长的方案,以便给予他们匹配的机会。

"cab" =~ /a|b|c/ # matches "c"
                 # /a|b|c/ == /[abc]/
  

最后一个例子指出字符类就像是字符的交替。在给定的字符位置,允许正则表达式匹配成功的第一个选项将是匹配的。

答案 2 :(得分:1)

通常,Perl中的默认正则表达式引擎会尝试按此顺序进行最左边和最长匹配。如果它可以匹配最左边的交替可能性并且仍然满足正则表达式的其余部分它将会。

但是,您可以更改正则表达式引擎。