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

时间:2017-10-24 15:40:32

标签: 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'

2 个答案:

答案 0 :(得分:6)

:ex会找到重叠匹配的所有可能组合。

:ov的作用类似于:ex,但它限制了搜索算法,限制它只查找给定起始位置的单个匹配项,从而导致它为给定长度生成单个匹配项。允许:ex从字符串的最开头开始查找新的唯一匹配,因此它可能会找到几个长度为3的匹配项; :ov只能找到一个长度为3的匹配。

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

Exhaustive

  

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

Overlapping

  

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

答案 1 :(得分:6)

副词类型

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

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

    以下是第二种类型的相关副词:

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

    (在每种情况下,正则表达式引擎一旦找到它在任何给定位置找到的内容就会继续运行,这就是为什么即使通过放置打印语句也看不到其他输出的原因在正则表达式中。)

    你的例子

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