2013-04-26 30 views
4

我是新來的Perl和正則表達式的世界,我試圖編寫一個正則表達式匹配0.0到4.0之間的GPA。所有匹配的值只能是兩個數字,用句點分隔(1.2,3.4,0.2等)。Perl中的GPA正則表達式

^[0]|[0-3]\.(\d?\d?)|[4].[0]$ 

這是我的,但它是不正確的,因爲它匹配「1.22」,「4a0」,「14.0」和「2.」。如果有人有任何建議,他們將不勝感激。

回答

4

這裏的幾個答案似乎不必要的複雜。相反,這個簡單的正則表達式應該這樣做:[0-3]\.\d|4\.0,假設單數字形式(例如'1')不是有效的輸入。 (我來自哪裏等等人,我不知道這是否是一個安全的假設,我們不使用GPA)

隨着錨正面和背面,因爲我在這裏看到別人用:

^([0-3]\.\d|4\.0)$ 

或者,如果你不需要捕獲組:

^(?:[0-3]\.\d|4\.0)$ 

,完整的解釋:正則表達式匹配要麼 0,1,2,或3後跟一個週期,任何一個數字,或者字串4.0。

0

試試這個:

(?<!\d)([0-3](\.\d?)|4(\.0)?)(?!\d) 

它採用(?<!)(?!)被稱爲提前後面負的外觀和負的樣子。這確保\d在正則表達式之前或之後不存在。它在正則表達式中不匹配,只是檢查它不在它之後。 此外,有了這個正則表達式,你不僅限於用行分隔的值。

(根據caimarvo建議修改)

0
^[0-3]{1}(\.\d{1}?)(?!\d)|(?<!.)4\.0?(?!.)$ 

這工作,同樣的想法看起來進取,爲後面多餘的字符。

+0

使用'{1}'是毫無意義的;只是省略它。即便如此,這似乎也不必要的複雜。 – 2013-04-28 22:23:44