2016-04-08 24 views
0
线

所以我做的是统计的git仓库的程序,但我有麻烦了一定的正则表达式工作。基本上,我有一个字符串,它看起来像这样:使用正则表达式来解析在Perl

my $string = "5 2 gitc" 

和正则表达式看起来像这样:

my ($added, $removed) = $string =~ /([0-9]*) *([0-9]*) *[a-z]*/; 

我的目标是存储的第一个数字为$添加和第二号$已删除,但由于某种原因没有价值被存储在$删除。所以,如果我使用print语句:

print "-$added $removed-\n"; 

输出的样子:

-5 - 

当我测试的是对正则表达式101我捕获组的正则表达式看起来做工精细,所以我种难倒至于为什么它不起作用。任何人都可以看到我的正则表达式的问题吗?

+1

是否有可能有一个制表符?当我在本地运行这两行(确保$字符串中的空格字符)时,它可以工作。即我得到“-5 2-” – Marty

+1

数字是可选的还是应该肯定在那里?如果他们应该总是在那里,那么尝试使用'+'而不是'*',就像这样:'/([0-9] +)+([0-9] +)+ [a-z] + /'。与'+'匹配的可能方式较少。 –

+0

@Marty,这是一个非常好的主意来检查。修改我的建议:'/([0-9] +)[\ t] +([0-9] +)[\ t] + [AZ] + /' –

回答

5

凯尔在评论中指出 - 如果数字在那里,然后用+而不是*,以减少可能的数量相匹配的RE引擎具有进行搜索。此外,由于\s匹配“空白”(定义为here[\ \t\r\n\f]),可以遮盖的制表符,通过使用它,而不是一个字面空格字符的投掷比赛关闭possibillity。

使用\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"; 
} 
0

为什么不

my ($added, $removed) = split ' ', $string;