考虑到 Perl 6 之类的替代方案,/(foo|foobar|foobaz)/
是否会承诺首先使用这三个中的哪一个,如果它确实在文档中的哪个位置做出了承诺?
问问题
190 次
2 回答
13
简而言之:备选方案应该(至少在名义上)并行匹配,最长的匹配获胜。如果你想要顺序交替,你可以使用双杠 ||,它保证从左到右的顺序就像 | 在 Perl 5 正则表达式中执行。
于 2009-04-20T06:24:04.443 回答
10
S05说
为此,Perl 6 中的每个正则表达式都需要能够将其“纯”模式与其动作区分开来,并返回其初始标记模式列表(传递性地包括由“纯”部分调用的任何子规则的标记模式)该正则表达式,但不包括任何子规则超过一次,因为这将涉及自我引用,这在传统正则表达式中是不允许的)。使用 | 的逻辑交替 然后获取两个或多个这些列表并分派到与最长标记前缀匹配的替代项。这可能是也可能不是首先出现在词汇上的替代方案。
但是,如果两个备选方案以相同的长度匹配,则首先通过特异性打破平局。以最长固定字符串开头的替代方案获胜;也就是说,精确匹配比使用字符类进行的匹配更接近。如果这不起作用,则通过两种方法之一打破平局。如果备选方案采用不同的语法,标准 MRO(方法解析顺序)将确定首先尝试哪一个。如果备选方案在同一个语法文件中,则文本上较早的备选方案优先。(如果一个文法的规则在多个文件中定义,则顺序未定义,如果首先尝试错误的,则必须使用显式断言来强制失败。)
这似乎是一个与 Perl 5 中的承诺截然不同的承诺。
于 2009-04-20T02:05:54.580 回答