2014-03-05 35 views
0

爲什麼以下兩個正則表達式的行爲不同?爲什麼這兩個正則表達式有不同的表現?

$millisec = "1391613310.1"; 
$millisec =~ s/.*(\.\d+)?$/$1/; 

$millisec =~ s/\d*(\.\d+)?$/$1/; 

此代碼打印什麼:

perl -e 'my $mtime = "1391613310.1"; my $millisec = $mtime; $millisec =~ s/.*(\.\d+)?$/$1/; print "$millisec";' 

雖然這種打印字符串的小數部分:

perl -e 'my $mtime = "1391613310.1"; my $millisec = $mtime; $millisec =~ s/\d*(\.\d+)?$/$1/; print "$millisec";' 
+0

順便說一下,這些不是毫秒; 0.1秒是100毫秒。 – tripleee

+0

你能寫得更乾淨嗎?趕上.1和1.1,但我不知道你想要的小數或整數。看起來像小數。所有'/(\d+.d+)$/$1/;'我喜歡使用內存,並在'[0-9]'上使用'\ d'來代替'/'。雖然意圖有點困惑,除了問他們爲什麼匹配不同。 – alexmac

+0

嗨亞歷克斯 - 是的,我想要小數。你的意思是「我如何寫這篇文章」或「正則表達式」?你可以建議更簡單的正則表達式(如果它的話)? 。 Triplee - 你是對的。我沒有提到我稍後使用sprintf來追加零。 –

回答

1

貪婪。

Perl的正則表達式引擎在進入下一期之前將盡可能匹配每個術語。因此,對於.*(.\d+)?$.*匹配整個字符串,則(.\d)?不匹配,因爲它是可選的。

​​只能匹配到的點,所以後來有匹配.1(.\d+)?

+0

關鍵部分是'(\。\ d +)'是* optional *。 –

+0

嗨鮑羅丁 - 爲什麼「\ d *」不貪婪,而「。*」是貪婪? –

8

在第一個正則表達式中,.*是一切佔用了字符串的結尾,所以沒有什麼可選的(.\d+)?可以撿起。 $1將爲空,所以該字符串被替換爲空字符串。

在第二個正則表達式中,只有數字從開頭抓起,因此\d*停在點的前面。 (.\d+)?將選擇該點,包括尾隨數字。

您在圓括號內使用.\d+,它將匹配任何字符加數字。如果你想明確地匹配一個點,你必須使用\.

爲了使第一正則表達式類似的行爲,第二個你會寫

$millisec =~ s/.*?(\.\d+)?$/$1/; 

以便初始.*不採取了一切。

相關問題