我不完全明白,为什么结果会有所不同.是否: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)
:ex 将找到重叠匹配的所有可能组合.
:ov就像:ex不同之处在于它通过限制它找到仅对于给定的起始位置的单个匹配,使其产生一个单一的匹配对于给定的长度,限制查找算法.:ex允许从字符串的最开头开始查找新的唯一匹配,因此它可能会找到几个长度为3的匹配项; :ov只能找到一个长度为3的比赛.
文档:https:
//docs.perl6.org/language/regexes
穷举:
要查找正则表达式的所有可能匹配项(包括重叠项)和几个从相同位置开始的匹配项,请使用:详尽(短:前)副词
重叠:
要获得多个匹配项,包括重叠匹配项,但每个起始位置只有一个(最长),请指定:overlap(short:ov)副词:
重要的是要了解有两种不同类型的正则表达式副词:
:sigspace/ :s,:ignorecase/ :i,......).这些也可以写在正则表达式中,并且只适用于正则表达式中其余的词法范围.:exhaustive/ :ex,:overlap/ :ov,:global/ :g).它们作为一个整体适用于给定的正则表达式匹配操作,并且必须在正则表达式之外写入,作为m//运算符或.match方法的副词.以下是第二类相关副词的作用:
m:ex/.../ 在每个可能的起始位置找到所有可能的匹配.m:ov/.../在每个可能的起始位置找到第一个可能的匹配.m:g/.../在上一场比赛结束后的每个可能的起始位置找到第一个可能的匹配(即,非重叠).m/.../在第一个可能的起始位置找到第一个可能的匹配.(在每种情况下,一旦它找到了在任何给定位置找到的正则表达式,正则表达式引擎就会继续运行,这就是为什么即使将print语句放在正则表达式中也不会看到额外的输出.)
在您的情况下,只有两种可能的匹配:ab|c和a|bc.
两者都从输入字符串中的相同位置开始,即在位置0处.
因此,只能m:ex/.../找到它们 - 所有其他变体只能找到其中一个,然后继续前进.
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |