gpt4 book ai didi

raku - 如何在 Perl 6 中否定/减去正则表达式(不仅是字符类)?

转载 作者:行者123 更新时间:2023-12-04 17:31:02 26 4
gpt4 key购买 nike

可以制作 conjunction ,以便字符串匹配 2 个或更多 regex模式。

> "banana" ~~ m:g/ . a && b . /
(「ba」)

另外,可以到 negate a character class : 如果我只想匹配辅音,我可以取所有字母并减去元音的字符类:

> "camelia" ~~ m:g/ <.alpha> && <-[aeiou]> /
(「c」 「m」 「l」)

但是,如果我需要否定/减去的不是字符类,而是 regex 呢?任何长度?像这样的东西:

> "banana" ~~ m:g/ . **3 && NOT ban / # doesn't work
(「ana」)

最佳答案

TL;博士 莫里茨的回答涵盖了一些重要问题。这个答案侧重于根据 Eugene 的评论匹配子字符串(“我想找到匹配正则表达式 R 的子字符串,但不匹配正则表达式 A 。”)。

写一个断言,说你没有坐在你不想匹配的正则表达式之前,然后用你想要匹配的正则表达式跟随它:

say "banana" ~~ m:g/ <!before ban> . ** 3 / # (「ana」)
before断言称为“零宽度”断言。这意味着如果它成功(在这种情况下意味着它不“匹配”,因为我们已经写了 !before 而不仅仅是 before ),匹配的位置不会移动。

(当然,如果这样的断言失败并且在当前匹配位置没有匹配的替代模式,匹配引擎然后向前移动一个字符位置。)

正如您在问题中所示,您可能希望以相反的顺序使用模式,首先是正匹配,然后是负匹配。 (也许正匹配比负匹配快,所以颠倒它们的顺序会加快匹配。)

适用于相当简单模式的一种方法是在断言后使用否定:
say "banana" ~~ m:g/ . ** 3 <!after ban> / # (「ana」)

但是,如果负模式足够复杂,您可能需要使用以下公式:
say "banana" ~~ m:g/ . ** 3 && <!before ban> .*? / # (「ana」)

这会插入一个 && regex conjunction operator假设 LHS 模式成功,在重置匹配位置后也尝试 RHS(这就是为什么 RHS 现在以 <!before ban> 而不是 <!after ban> 开头)并要求 RHS 匹配相同长度的输入(这是为什么 <!before ban> 后面跟着 .*? “填充”)。

关于raku - 如何在 Perl 6 中否定/减去正则表达式(不仅是字符类)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47396166/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com