我不完全明白,为什么结果会有所不同.是: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 /…/会找到它们 – 所有其他变体只能找到其中一个,然后继续前进.