【问题标题】:Regular expression matches too often正则表达式匹配太频繁
【发布时间】:2016-12-12 08:44:09
【问题描述】:

我有一个包含某些类名 + 方法调用的字符串。我想提取这些,但我为此编写的正则表达式返回的匹配项比预期的要多。

#!/usr/bin/perl

$someInput = "Lorem ipsum  dolor sit CLASS3.aMethod.anotherMethod amet, consetetur sadipscing CLASS1.bMethod elitr, sed diam nonumy eirmod";

@matches = ($someInput =~ /((CLASS1|CLASS2|CLASS3)(\.[A-Za-z0-9_]+){1,})/g);
foreach my $match (@matches) {
    print $match . "\n";
}

除了“CLASS.methodOne.methodTwo...”形式的一个匹配之外,它还分别匹配类名和方法。请看示例结果:

CLASS3.aMethod.anotherMethod
CLASS3
.anotherMethod
CLASS1.bMethod
CLASS1
.bMethod

我真正想要的:

CLASS3.aMethod.anotherMethod
CLASS1.bMethod

如果有人可以帮助我,我将不胜感激。简短的解释也很好:) 谢谢!

【问题讨论】:

  • 删除所有无用的捕获组,并在需要时使用非捕获组。仅显示您想要的组。

标签: regex perl pattern-matching


【解决方案1】:

这是因为您有 3 个匹配组:

$1 = ((CLASS1|CLASS2|CLASS3)(\.[A-Za-z0-9_]+){1,})
$2 = (CLASS1|CLASS2|CLASS3)
$3 = (\.[A-Za-z0-9_]+){1,}

以及您在@matches 中输入的所有这些组($1、$2、$3)。

【讨论】:

    【解决方案2】:

    正则表达式

    ((CLASS1|CLASS2|CLASS3)(\.[A-Za-z0-9_]+){1,}))
    

    定义 3 个捕获组,每个组由一对平衡的或括号描述:

    1: ((CLASS1|CLASS2|CLASS3)(\.[A-Za-z0-9_]+){1,})
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    2: ((CLASS1|CLASS2|CLASS3)(\.[A-Za-z0-9_]+){1,})
         ^^^^^^^^^^^^^^^^^^^^
    
    3: ((CLASS1|CLASS2|CLASS3)(\.[A-Za-z0-9_]+){1,})
                               ^^^^^^^^^^^^^^^
    

    因此,当一个表达式与该表达式成功匹配时,结果将是 3 个匹配。

    使用(?:...) 语法将表达式作为正则表达式中的逻辑单元保持在一起,但将其指定为非捕获组。此表达式在成功时只会返回一个匹配项:

    ((?:CLASS1|CLASS2|CLASS3)(?:\.[A-Za-z0-9_]+){1,})
    

    【讨论】:

    • 谢谢,这就是解决方案!我没有经常使用正则表达式,甚至不知道非捕获组...太好了,今天学到了一些新东西;)
    猜你喜欢
    • 2010-11-25
    • 2014-10-06
    • 2013-11-25
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 2019-03-30
    相关资源
    最近更新 更多