我有一个包含某些类名+方法调用的字符串。我想提取这些,但我写的正则表达式会返回比预期更多的匹配。
#!/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
如果有人能帮助我,我将不胜感激。一个简短的解释也很棒:)谢谢!
答案 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,})