正则表达式断言仅适用于前瞻和后视方式

Regex assertions working only in lookahead and lookbehind fashion

在尝试为 solving this issue 想出一些示例时,我想到了这个片段:

my regex key {^^ <![#-]> \d+ }
say "333" ~~ &key;                         # OUTPUT: «「333」␤»
say "#333" ~~ &key;

say '333$' ~~ m/ \d+ <?[$]>/;              # OUTPUT: «「333」␤»
say '333' ~~ m/ \d+ <?[$]>/;
say '3' ~~ m/<?[$]> \d+ /;

仅指示 return 「333」 的语句似乎表明 <! > 用作前瞻断言,而 <? > 仅用作零宽度后视。是这样吗?如果是这样,那么创建正面前瞻断言和负面回顾的方法是什么?

我认为你只是误解了你的实验。

<? > works only as zero-width lookbehind. Is that the case?

没有。这是一个展望。根据您自己的实验:

say '333$' ~~ m/ \d+ <?[$]>/;              # OUTPUT: «「333」␤»

\d+ 匹配 333

<? > 执行零宽度断言。它断言什么?它肯定地(? 而不是 !)断言 下一个 字符(所以它是前瞻性的,就像大多数正则表达式模式一样)必须是 $。下一个字符确实是$,所以断言成功。但由于它是一个 zero-width 断言,它不会向前移动匹配的游标。 (这就是 "zero-width" 方面的意思。)

然后整体正则完成,整体正则成功,整体正则抓取刚好333.

say '333' ~~ m/ \d+ <?[$]>/;

在这种情况下,没有 $ 正断言匹配,因此整体匹配失败。

say '3' ~~ m/<?[$]> \d+ /;

和以前一样,<?[$]> 断言下一个字符是 $。是的,所以它成功了。但是,因为它是一个 zero-width 断言,它不会推进光标

然后 \d+ 失败(因为匹配的光标仍然指向 $)。