首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl当前(5.8和5.10)是否对将使用的顺序交替做出任何承诺?

Perl当前(5.8和5.10)是否对将使用的顺序交替做出任何承诺?
EN

Stack Overflow用户
提问于 2009-04-20 00:18:17
回答 3查看 202关注 0票数 2

给定一个像/(foo|foobar|foobaz)/这样的替代,Perl5.8或5.10是否承诺将首先使用这三种语言中的哪一种,如果是的话,它在文档中的什么地方做出了这种承诺?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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可以匹配时更好的匹配。

(在上下文中,只有当使用S的匹配至少与使用T的匹配在字符串中的早期匹配时,这才是限定的。)

票数 4
EN

Stack Overflow用户

发布于 2009-04-20 00:28:05

perldoc perlrequick中似乎有一个承诺

为了匹配dogcat,我们形成正则表达式dog|cat。与前面一样,perl将尝试在字符串中尽可能早的位置匹配正则表达式。在每个字符位置,perl将首先尝试匹配第一个替代字符dog。如果dog不匹配,则perl将尝试下一个替代方法cat。如果cat也不匹配,则匹配失败,并且perl移动到字符串中的下一个位置。

perldoc perlretut似乎以一种更强有力的方式做出了承诺(但有一个警告):

代码语言:javascript
复制
"cats"          =~ /c|ca|cat|cats/; # matches "c"
"cats"          =~ /cats|cat|ca|c/; # matches "cats"

在这里,所有的选择都在第一个字符串位置匹配,所以第一个选择就是匹配的那个。如果某些备选方案是其他备选方案的截断,则将最长的方案放在第一位,以便给它们一个匹配的机会。

代码语言:javascript
复制
"cab" =~ /a|b|c/ # matches "c"
                 # /a|b|c/ == /[abc]/

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

票数 3
EN

Stack Overflow用户

发布于 2009-04-20 17:26:38

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

但是,您可以更改regex引擎。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/766474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档