2012-11-13 40 views
2

當使用JavaScript的RegEx驗證帶小數點的數字時,會出現不一致的結果。我們的目標是讓任何數字組合後跟一個小數點和兩個數字。除了數以千計的數字(無分隔符)之外,它工作正常。JavaScript RegEx匹配無效號碼

這是我使用的表達:

^[0-9]+(\.[0-9][0-9])$ 

有效數字:

10.99 
0.75 
999.99 
5000.99 
...etc 

無效編號:

1000 
.75 
0 
...etc 

的問題是,它在整個數字匹配數千人。這是爲了一個內部應用程序,所以我不關心使用額外的分隔符。我用http://regexpal.com/這樣的工具測試了這個表達式,它給了我需要的結果,所以看起來在JS中有一些東西導致了這個問題。

您可以複製這裏的問題: http://jsfiddle.net/hcAcQ/

回答

5

您需要.之前轉義反斜槓,我相信:

^[0-9]+(\\.[0-9][0-9])$ 

的原因,一個4位數字(或以上)數量將工作是因爲單個反斜槓實際上並未將.轉義爲句點字符,因此導致它充當通配符「match any character」點。

當你有3倍或更少的數字失敗,因爲沒有足夠的字符在正則表達式的每一場比賽,但有4位,將工作(第一個字符類一個數字,一個用於.,和每一個其他兩個字符類。

逃離\將導致.實際上被解釋爲字面.性格,你可能是打算。你也可以代替定義變量作爲一個正則表達式字面(MDN example; near the top)讓你不必在字符串內處理轉義\個字符:

//instead of new valueFormat = new RegExp('^[0-9]+(\\.[0-9])$'); 
valueFormat = /^[0-9]+\.[0-9][0-9]$/; 
+3

當在JavaScript正則表達式定義,使用本機/.../構建來避免這個問題... http://jsfiddle.net/gHHPG/ – FrankieTheKneeMan

+0

真棒...謝謝!爲了清晰起見,我最終使用了本地構造。 –

0

This works(\。代替):

// valueFormat = new RegExp('^([0-9]+)(\.[0-9][0-9])$');  
valueFormat = new RegExp('^([0-9]+)(\\.[0-9][0-9])$');