我想我失去了一些東西簡單在這裏...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?
乾杯,斯圖
我想我失去了一些東西簡單在這裏...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?
乾杯,斯圖
因爲.*?
是懶惰,如果可以匹配零個字符。錨正則表達式的字符串的結尾:
$key =~ m/deco-(.*?)-(.*?)-(.*?):(.*?):(.*?)$/
但它幾乎總是最好使用的東西比捕獲所有.*
和.*?
更加明確。告訴正則表達式引擎到底想要匹配什麼。假設在實際的比賽永遠不會發生分隔符-
和:
,我建議
$key =~ m/deco-([^-]*)-([^-]*)-([^:]*):([^:]*):([^:]*)$/
[^-]
意味着「匹配任何字符,除了-
」。[^:]
表示「匹配除:
以外的任何字符」。謝謝蒂姆,我已經添加了'$'到最後,但由於某種原因,我的Perl不喜歡它,掛在我身上,現在它工作正常:) –
它可能已經掛了,因爲字符串不匹配,並且所有這些'。*?'的排列數量呈指數級增長。這被稱爲[災難性的回溯](http://www.regular-expressions.info/catastrophic.html),這是爲什麼'。*'應該避免的原因之一,如果一個更具體的匹配規則是可能的。 –
split qr/[:-]/, 'deco-1-LB-700F:MAR:40'
回報
(
'deco',
1,
'LB',
'700F',
'MAR',
40,
)
來到這裏發表。更簡單。假設你自己已經有了'deco'開頭的字符串。 OP可能會在更大的文本中搜索它。 – AmbroseChapel
謝謝你,那樣更容易!是的,我只搜索以deco開頭的字符串。我必須感謝蒂姆,因爲他回答了我的問題,爲什麼5美元不是我所期望的,但我會用它作爲我編碼的答案 –
你需要tghe最後? –