正则表达式断言仅在先行和后备方式中起作用

jjm*_*elo 4 regex perl6 regex-lookarounds raku

在尝试提出一些解决此问题的示例时,我提出了以下代码段:

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

say '333$' ~~ m/ \d+ <?[$]>/;              # OUTPUT: «?333??»
say '333' ~~ m/ \d+ <?[$]>/;
say '$333' ~~ m/<?[$]> \d+ /;
Run Code Online (Sandbox Code Playgroud)

只有表示为return的语句?333?似乎<! >可以用作先行断言,而<? >只能用作零宽度后向断言。是这样吗 如果是这样,创建正向超前断言和负向向后断言的方式是什么?

rai*_*iph 8

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

<? >仅用作零宽度后向。是这样吗

不,这是一个前瞻。根据您自己的实验:

say '333$' ~~ m/ \d+ <?[$]>/;              # OUTPUT: «?333??»
Run Code Online (Sandbox Code Playgroud)

\d+场比赛333

<? >做了零宽度断言。它断言了什么?它肯定地(?不是!)断言下一个字符(像大多数正则表达式模式一样是前瞻性)必须是$。下一个字符确实是$,因此断言成功。但是由于它是零宽度的断言,因此不会使匹配的游标向前移动。(这就是“零宽度”方面的含义。)

然后,完成了整个正则表达式,成功了整个正则表达式,并且仅捕获了正则表达式333

say '333' ~~ m/ \d+ <?[$]>/;
Run Code Online (Sandbox Code Playgroud)

在这种情况下$,肯定断言不匹配,因此整体匹配失败。

say '$333' ~~ m/<?[$]> \d+ /;
Run Code Online (Sandbox Code Playgroud)

如前所述,<?[$]>断言下一个字符是$。是的,所以成功了。但是,因为它是零宽度的断言,所以它不会使游标前进

所述\d+然后失败(因为匹配光标在一个仍然是指向$)。