正则表达式断言仅适用于前瞻和后视方式
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+
失败(因为匹配的光标仍然指向 $
)。
在尝试为 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+
失败(因为匹配的光标仍然指向 $
)。