在Perl 6中使正则表达式完全匹配零个字符的最佳方法是什么?

Eug*_*sky 4 perl6

如何明确定义regex(编号或命名的捕获组),它总是匹配零个字符?

> "abc" ~~ m/()abc/
===SORRY!=== Error while compiling:
Null regex not allowed

> my regex null {}
===SORRY!=== Error while compiling:
Null regex not allowed

> my regex null {<[]>}
regex null {<[]>}
> "abc" ~~ m/<null>abc/
False
Run Code Online (Sandbox Code Playgroud)

当然我可以使用类似下面的内容,但我正在寻找一种惯用的方法.

> my regex null {a ** 0}
regex null {a ** 0}
> "abc" ~~ m/<null>abc/
?abc?
 null => ??
Run Code Online (Sandbox Code Playgroud)

UPD:这有效,但这是最好的方法吗?

> my regex null { '' }
regex null { '' }
> "abc" ~~ m/<null>abc/
?abc?
 null => ??
> "abc" ~~ m/('') abc/
?abc?
 0 => ??
Run Code Online (Sandbox Code Playgroud)

pio*_*ojo 8

始终成功并匹配0个字符的断言是:<?>.

例如:

say so 'foo' ~~ / <?> 'foo' /;
# output: True
Run Code Online (Sandbox Code Playgroud)

正如raiph指出的那样,相应的负面版本总是失败的<!>.如果输入有效,我已经使用它来在不应该达到部分解析时插入错误消息.正则表达式的那一部分可能是:

\d || [ { note "Error: the previous token must be followed by a number."; } <!> ]
Run Code Online (Sandbox Code Playgroud)

  • @EugeneBarsky有点像'''?`但更简单/更快.`<something-goes-here>`是一个断言.有许多不同形式的断言但都遵循相同的逻辑.如果断言为True,则匹配继续.如果为False,则匹配停止(或回溯).一些断言消耗了一些输入(如果它们是True).其他人则没有(在这种情况下,他们被称为零宽度断言).`<?>`和`<!>`是这些零宽度断言中最简单的.也没有任何输入处理.两者都不消耗任何输入.`<?>`返回True,`<!>`返回False.Aiui就这么简单. (3认同)