给定一个像/(foo|foobar|foobaz)/这样的替代,Perl5.8或5.10是否承诺将首先使用这三种语言中的哪一种,如果是的话,它在文档中的什么地方做出了这种承诺?
请参阅相关问题Does Perl 6 make any promises about the order alternations will be used?
发布于 2009-04-20 03:57:40
http://perldoc.perl.org/perlre.html#Combining-RE-Pieces
如果我们将正则表达式a|ab与"abc“匹配,它是否会匹配子字符串"a”或"ab“?描述哪个子字符串实际匹配的一种方法是回溯的概念(参见“回溯”)。但是,这种描述过于低级,会让您从特定实现的角度进行思考。
另一种描述以“更好”/“更差”的概念开始。
同样,对于基本块,没有这样的问题,因为在给定位置最多可能有一个匹配。本节描述了组合运算符的更好/更差的概念。在下面的描述中,S和T是正则子表达式。
..。
当S可以匹配时,它是比只有T可以匹配时更好的匹配。
(在上下文中,只有当使用S的匹配至少与使用T的匹配在字符串中的早期匹配时,这才是限定的。)
发布于 2009-04-20 00:28:05
在perldoc perlrequick中似乎有一个承诺
为了匹配dog或cat,我们形成正则表达式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]/最后一个例子指出,字符类就像字符的交替。在给定的字符位置,允许正则表达式匹配成功的第一个备选方案将是匹配的那个。
发布于 2009-04-20 17:26:38
通常,Perl中的默认正则表达式引擎会按此顺序尝试进行最左边和最长的匹配。如果它可以匹配最左边的交替可能性,并且仍然满足regex的其余部分,它就会。
但是,您可以更改regex引擎。
https://stackoverflow.com/questions/766474
复制相似问题