2016-04-08 29 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;