所以我制作了一个程序来统计git存储库,但是我无法使某个正则表达式起作用。基本上,我有一个看起来像这样的字符串:
my $string = "5 2 gitc"
和一个看起来像这样的正则表达式:
my ($added, $removed) = $string =~ /([0-9]*) *([0-9]*) *[a-z]*/;
我的目标是将第一个数字存储为$ added,将第二个数字存储为$ remove,但由于某种原因,$ remove中没有存储任何值。所以,如果我使用print语句:
print "-$added $removed-\n";
输出如下:
-5 -
当我在正则表达式101上测试正则表达式时,我的捕获组看起来工作得很好,所以我有点难过为什么它不起作用。任何人都可以看到我的正则表达式出现问题吗?
答案 0 :(得分:5)
正如Kyle在评论中指出的那样 - 如果数字有,那么使用+
而不是*
来减少RE引擎可能匹配的数量搜索。此外,由于\s
匹配"空格" (将here定义为[\ \t\r\n\f]
),您可以通过使用它而不是文字空格字符来涵盖制表符的可能性。
使用\s
匹配空格也可以释放文字空间字符,以协助正则表达式本身的格式化。为此,请使用'扩展模式'通过在规范的末尾添加/x
来进行正则表达式。
最后,作为一般规则,在分配给变量之前测试成功匹配;
my $string = "5 2 gitc";
if ($string =~ /(\d+) \s+ (\d+) [a-z]+/x) {
my ($added, $removed) = ($1, $2);
}
else
print "Failed match\n";
}
答案 1 :(得分:0)
为什么不
my ($added, $removed) = split ' ', $string;