正则表达式经常匹配

时间:2016-08-05 20:53:05

标签: regex perl pattern-matching

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

#!/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

如果有人能帮助我,我将不胜感激。一个简短的解释也很棒:)谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

以及所有这些群组(1美元,2美元,3美元)你放入@matches。

答案 1 :(得分:0)

正则表达式

((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,})