*Perl 6中的量词

Eug*_*sky 5 regex match perl6 quantifiers

这似乎是我在这里不理解的非常基本的东西.

为什么不"babc"匹配/ a * /

> "abc" ~~ / a /
?a?
> "abc" ~~ / a * /
?a?
> "babc" ~~ / a * /
??                    # WHY?
> "babc" ~~ / a + /
?a?
Run Code Online (Sandbox Code Playgroud)

Pav*_*kyi 8

因为*量词使前面的原子匹配次或多次.

??/ a * /任何字符串中的第一个匹配项.例如:

say "xabc" ~~ / a * . /; # OUTPUT: ?x?
Run Code Online (Sandbox Code Playgroud)

它是一样的:

say "xabc" ~~ / (a+)? . /;
Run Code Online (Sandbox Code Playgroud)

如果您将模式设置得更精确,您将获得另一个结果:

say "xabc" ~~ / x a * /; # OUTPUT: ?xa?
say "xabc" ~~ / a * b /; # OUTPUT: ?ab?
Run Code Online (Sandbox Code Playgroud)


mor*_*itz 7

这里的答案是正确的,我只是尝试以更连贯的形式呈现它们:

匹配始终从左侧开始

正则表达式引擎始终从字符串的左侧开始,并且优先选择最长匹配的最左侧匹配

* 匹配空字符串

正则表达式a*匹配可以匹配字符串'','a','aa'等它总是喜欢它找到的最长匹配,但它无法找到匹配比空字符串时间越长,它只会匹配空字符串.

把它放在一起

'abc' ~~ /a*/,正则表达式引擎从位置0开始,a*匹配尽可能多的a,因此匹配第一个字符.

'babc' ~~ /a*/,正则表达式引擎从位置0开始,并且a*只能匹配零个字符.它成功地做到了.由于整体比赛成功,因此没有理由在第1位再次尝试.

  • @EugeneBarsky据推测,`grep`下的正则表达式引擎也匹配空字符串,但`grep`选择不显示它们.另外,`grep`可能默认为多重匹配.所以`echo babaac | grep'a*'`,显示类似"b**a**b**aa**c"的内容,对应于`say"babaac"~~ m:g/a*/`,显示`(" "a"「」「aa」「」「」)`. (4认同)