当前位置: 首页 > 知识库问答 >
问题:

如何在Perl 6中求反/减去正则表达式(不仅仅是字符类)?

贺高杰
2023-03-14

可以进行连接,以便字符串匹配2个或多个regex模式。

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

此外,可以否定一个字符类:如果我只想匹配辅音,我可以取所有字母并减去元音的字符类:

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

但是如果我不需要对字符类求反/求差,而是对任意长度的正则表达式求反/求差,该怎么办?类似这样:

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

共有2个答案

袁鸿达
2023-03-14

“否定”正则表达式到底是什么意思?

当你谈论regex的计算机科学定义时,它总是需要匹配整个字符串。在这种情况下,否定很容易定义。但默认情况下,Perl 6中的正则表达式进行搜索,因此它们不必匹配整个字符串。这意味着您必须小心定义“否定”的含义。

如果对正则表达式A的否定是指当A不匹配整个字符串时匹配的正则表达式,反之亦然,您确实可以使用

如果对正则表达式a求反的意思是“仅当a在字符串中不匹配时才匹配”,则必须使用类似于[

如果你有另一个否定的定义,请分享。

阚乐湛
2023-03-14

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

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

say "banana" ~~ m:g/ <!before ban> . ** 3 / # (「ana」)

前面的断言称为“零宽度”断言。这意味着如果它成功了(在本例中,这意味着它不“匹配”,因为我们写的是!before,而不仅仅是before),匹配位置不会移动。

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

您可能希望模式的顺序相反,如您在问题中所示,首先是正匹配,然后是负匹配。(可能正匹配比负匹配快,因此颠倒顺序会加快匹配速度。)

对相当简单的模式有效的一种方法是使用否定的after断言:

say "banana" ~~ m:g/ . ** 3 <!after ban> / # (「ana」)

但是,如果负模式足够复杂,您可能需要使用以下公式:

say "banana" ~~ m:g/ . ** 3 && <!before ban> .*? / # (「ana」)

这将插入一个<代码>

 类似资料:
  • 本文向大家介绍字符类:减法-Java正则表达式,包括了字符类:减法-Java正则表达式的使用技巧和注意事项,需要的朋友参考一下 您可以从另一个范围中减去一个范围,并将其用作新范围。您可以使用字符类的两个变体来实现这一点,即取反和交集。 例如,范围[al]和[^ eh]的交集给您字符a至l作为愤怒减去字符[eh] 示例 输出结果

  • 问题内容: 我对和都错了。我想检查哈希是否仅包含数字。我错过了什么? 问题答案: 应该这样做。原始匹配的任何内容都只包含一位数字。

  • 我有以下正则表达式在Java: 如果输入“a334234234”,验证将失败。但是,如果输入“a3423423fsfsdf”,验证将成功。。。 以下正则表达式也是如此,它检查输入是否仅为数字: 如果输入4SASD,验证将失败,但如果输入3dfsdf22,验证将成功。你能帮我做这个吗?

  • 问题内容: 我在表格栏中 我只需要得到那行,列中的值正好是10个符号,所有这些符号都只是数字 为此必须编写什么查询? 我在尝试 但这不会返回0行 问题答案: 您正在寻找的模式是或。 一切都在手册中。

  • 我在一个多语言网站上工作,并已选择使用每种语言的自定义URL,例如: 两者都指向城市控制员的指数方法。 在每个页面上都有一个切换语言的选项,它会在我的路由中查找以匹配控制器、视图和语言。 因此,如果我在荷兰语页面上,它会找到英文版的正确网址,即“城市”而不是“steden”。 在我开始使用更复杂的正则表达式之前,一切都很好。 我有这些正则表达式,它们将匹配我所需的URL: 在我的代码中,我可以访问

  • 我有一根这样的绳子 余额:“5048543747”,余额:“5119341413”,帐号:“0001000918”, 我使用了REGEX (.*?), 结果我收到的第一个子字符串是 余额:“5048543747” 实际上,我想要得到的结果是数组包括 { 余额:“5048543747” Baldefovd:“5119341413” 账号:“0001000918” } 有人能帮我吗。多谢。 编辑 我使