使用正则表达式解析Perl中的一行

时间:2016-04-08 02:48:47

标签: regex git perl

所以我制作了一个程序来统计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上测试正则表达式时,我的捕获组看起来工作得很好,所以我有点难过为什么它不起作用。任何人都可以看到我的正则表达式出现问题吗?

2 个答案:

答案 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;