Raku中实现「最佳正则技巧」的简化方案探讨
Raku正则实现「匹配含Tarzan但排除单独"Tarzan"」的简洁方案
需求明确:匹配包含Tarzan的字符串,但排除**完全等于"Tarzan"**的情况,且匹配结果需满足:
('"Tarzan"', 'Tarzan', '"Tarzan and Jane"') <<~~>> /some-regex/ # 期望输出:(Nil 「Tarzan」 「Tarzan」)
直接实现方案
利用Raku正则的负前瞻断言结合锚点,就能简洁达成目标:
my @test-inputs = '"Tarzan"', 'Tarzan', '"Tarzan and Jane"'; my @results = @test-inputs <<~~>> / ^ (?! "Tarzan" $ ) .* (Tarzan) .* $ /; say @results; # 输出:(Nil 「Tarzan」 「Tarzan」)
正则拆解
^和$:锚定整个字符串,确保判断的是完整输入而非子串(?! "Tarzan" $ ):负前瞻断言,直接排除完全等于"Tarzan"的输入——若当前位置到结尾是"Tarzan",则不匹配.* (Tarzan) .*:匹配任意字符并捕获其中的Tarzan,确保只要输入不是单独的"Tarzan"但包含Tarzan,就能成功捕获目标内容
更简洁的变体
如果追求极致简洁,也可以用以下等价写法,但不如锚点+负前瞻的方案精准直观:
/ (Tarzan) <!after $> || <!before ^> (Tarzan) /
效果验证
对测试输入执行匹配后,结果完全符合预期:
"Tarzan":被负前瞻排除,返回NilTarzan:无排除条件触发,捕获「Tarzan」"Tarzan and Jane":包含Tarzan且不是单独字符串,捕获「Tarzan」
内容的提问来源于stack exchange,提问作者Hovercouch
相关产品推荐
相关产品推荐

