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

Eug*_*sky 5 perl6

我不完全明白,为什么结果会有所不同.是否: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'
Run Code Online (Sandbox Code Playgroud)

ant*_*duh 6

:ex 将找到重叠匹配的所有可能组合.

:ov就像:ex不同之处在于它通过限制它找到仅对于给定的起始位置的单个匹配,使其产生一个单一的匹配对于给定的长度,限制查找算法.:ex允许从字符串的最开头开始查找新的唯一匹配,因此它可能会找到几个长度为3的匹配项; :ov只能找到一个长度为3的比赛.

文档:https:
//docs.perl6.org/language/regexes

穷举:

要查找正则表达式的所有可能匹配项(包括重叠项)和几个从相同位置开始的匹配项,请使用:详尽(短:前)副词

重叠:

要获得多个匹配项,包括重叠匹配项,但每个起始位置只有一个(最长),请指定:overlap(short:ov)副词:


sml*_*mls 6

副词的类型

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

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

匹配副词

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

  • m:ex/.../ 在每个可能的起始位置找到所有可能的匹配.
  • m:ov/.../在每个可能的起始位置找到第一个可能的匹配.
  • m:g/.../在上一场比赛结束后的每个可能的起始位置找到第一个可能的匹配(即,非重叠).
  • m/.../在第一个可能的起始位置找到第一个可能的匹配.

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

你的榜样

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

  • 就``ex`而言,它们不是同一个匹配 - 它们是两个恰好具有相同起点和终点的匹配...... :)实际上它们在这种情况下有不同的捕获. (2认同)