微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

perl6 – :ex和:带有Perl 6命名捕获的ov副词

我不完全明白,为什么结果会有所不同.是:ov仅适用于< left>,所以找到最长的匹配它不会做任何其他事情?
my regex left {
    a  | ab
}
my regex right {
    bc | c
}

"abc" ~~ m:ex/<left><right> 
   {put $<left>,'|',$<right>}/; # 'ab|c' and 'a|bc'
say '---';

"abc" ~~ m:ov/<left><right> 
   {put $<left>,$<right>}/; # only 'ab|c'

解决方法

副词的类型

重要的是要了解有两种不同类型的正则表达式副词:

>那些微调你的正则表达式代码编译的那些(例如:sigspace /:s,:ignorecase /:i,…).这些也可以写在正则表达式中,并且只适用于正则表达式中其余的词法范围.
>找到并返回控制正则表达式匹配的那些(例如:详尽的/:ex,:overlap /:ov,:global /:g).这些适用于整个给定的正则表达式匹配操作,并且必须在正则表达式之外写入,作为m //运算符或.match方法的副词.

匹配副词

以下是第二类相关副词的作用:

> m:ex /…/在每个可能的起始位置找到所有可能的匹配.
> m:ov /…/在每个可能的起始位置找到第一个可能的匹配.
> m:g /…/在前一个匹配结束之后的每个可能的起始位置找到第一个可能的匹配(即,非重叠).
> m /…/在第一个可能的起始位置找到第一个可能的匹配.

(在每种情况下,一旦它找到了在任何给定位置找到的正则表达式,正则表达式引擎就会继续运行,这就是为什么即使将print语句放在正则表达式中也不会看到额外的输出.)

你的榜样

在您的情况下,只有两种可能的匹配:ab | c和a | bc.两者都从输入字符串中的相同位置开始,即在位置0处.所以只有m:ex /…/会找到它们 – 所有其他变体只能找到其中一个,然后继续前进.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐