2011-09-26 53 views
2

我想我失去了一些東西簡單在這裏...Perl的正則表達式匹配的問題

$key = "deco-1-LB-700F:MAR:40"; 
    if ($key =~ m/deco-(.*?)-(.*?)-(.*?):(.*?):(.*?)/) { 
     print "1=$1 2=$2 3=$3 4=$4 5=$5"; 
    } 

這將導致輸出:1 = 1 2 = LB 3 = 700F 4 = 3月5日=

爲什麼不是$ 5返回值40?

乾杯,斯圖

+0

你需要tghe最後? –

回答

6

因爲.*?是懶惰,如果可以匹配零個字符。錨正則表達式的字符串的結尾:

$key =~ m/deco-(.*?)-(.*?)-(.*?):(.*?):(.*?)$/ 

但它幾乎總是最好使用的東西比捕獲所有.*.*?更加明確。告訴正則表達式引擎到底想要匹配什麼。假設在實際的比賽永遠不會發生分隔符-:,我建議

$key =~ m/deco-([^-]*)-([^-]*)-([^:]*):([^:]*):([^:]*)$/ 
  • [^-]意味着「匹配任何字符,除了-」。
  • [^:]表示「匹配除:以外的任何字符」。
+0

謝謝蒂姆,我已經添加了'$'到最後,但由於某種原因,我的Perl不喜歡它,掛在我身上,現在它工作正常:) –

+0

它可能已經掛了,因爲字符串不匹配,並且所有這些'。*?'的排列數量呈指數級增長。這被稱爲[災難性的回溯](http://www.regular-expressions.info/catastrophic.html),這是爲什麼'。*'應該避免的原因之一,如果一個更具體的匹配規則是可能的。 –

2
split qr/[:-]/, 'deco-1-LB-700F:MAR:40' 

回報

(
    'deco', 
    1, 
    'LB', 
    '700F', 
    'MAR', 
    40, 
) 
+0

來到這裏發表。更簡單。假設你自己已經有了'deco'開頭的字符串。 OP可能會在更大的文本中搜索它。 – AmbroseChapel

+0

謝謝你,那樣更容易!是的,我只搜索以deco開頭的字符串。我必須感謝蒂姆,因爲他回答了我的問題,爲什麼5美元不是我所期望的,但我會用它作爲我編碼的答案 –