2012-11-07 103 views
0

我有這種表情的唯一有效數...換號只允許1逗號和小數點正則表達式

^[0-9,-\.]+$ 

這工作得很好,但我需要確保最大的1 ,和1 .能被輸入?這需要迎合不同的文化,所以對我來說無關緊要的是,.

任何人都可以幫忙嗎?

+1

我會很感激的例子。浮點數是你想要匹配的嗎? –

+0

你的正則表達式認爲'。---,'是一個有效的數字。我不。 ;)另外,不要忘記正確的逗號類型是依賴於文化的。 – Lucero

+0

我明白你爲什麼要允許不超過一個小數點分隔符,但爲什麼只允許一個千位分隔符? 「1,000,000.00」不是有效的號碼嗎?或'1.000.000,00',取決於你的區域? (甚至'1'000'000,00'和其他許多變種可以在現實生活中找到...) –

回答

1

如果您正則表達式的味道支持向前看符號可以使用:

^(?=[^,],[^,]$)(?=[^.]\.[^.]$)[\d,.-]+$ 

如果沒有,那麼你可以做這樣的事情:

^(?:[\d-]*,?[\d-]*\.?[\d-]*|[\d-]*\.[\d-]*,[\d-]*)$ 

但我覺得這是比較難看。

請注意,我改變了你的角色等級。 [0-9]可以縮短爲\d(注意,根據您的正則表達式,這可能與其他Unicode數字相比,不僅僅是0-9),.不需要在字符類內部轉義,並且-屬於字符類的開始或結束,否則他們需要逃脫。有趣的是,在你的情況下,它甚至沒有什麼區別,因爲,-.創建了一個從,.(按ASCII順序)的字符範圍。然而,該範圍內的所有字符順帶地是,,-.。幸運的你;)

然而,這兩個答案真的只是做你明確要求。你的模式將仍然匹配--.--34,---1--2和類似的東西。如果你真的想匹配與文化無關的小數點的有效數字,你應該使用這個代替:

^-?\d*([.,]\d+)?$ 

,如果你想匹配.小數點的有效數字,最多一個,千分離器(反之亦然),這:

^-?\d{0,3}(?:(?:,\d{3})?(?:\.\d+)?|(?:\.\d{3})?(?:\,\d+)?)$ 

我不認爲有一個更短的版本,真的。不要擔心所有的?:。他們只是使子模式不捕獲。既然你不需要這個,那通常會顯着提高性能。

+0

請注意'\ d'可能不僅僅匹配0-9(unicode數字匹配的不僅僅是這10個十進制數字;你們還有阿拉伯數字等) – Lucero

+0

@Lucero我想這取決於正則表達式的風格,但好點。 –

+0

感謝您提供的所有幫助,我需要做的僅僅是確保輸入的有效數字沒有任何文字或空格。所以10是可以接受的。 10.00是可以接受的。 10,000.00將是可以接受的以及文化等值10.000,00。 – Stuart

0

這是我可能會用到的。

/^-?\d{0,2}((\.?\d{3})*(,\d+)?|(,?\d{3})*(\.\d+)?)$/ 
/* 

^     beginning of string 
-?     0 or 1 minus sign 
\d{0,2}    0-2 numbers 
(
    (\.?\d{3})*  0 or more (3-digit numbers, alternatively preceded by a dot) 
    (,\d+)?   0 or 1 (comma and at least 1 number) 
|     or 
    (,?\d{3})*  0 or more (3-digit numbers, alternatively preceded by a comma) 
    (\.\d+)?  0 or 1 (dot and at least 1 number) 
) 
$     end of string 

*/ 

編輯:你可以,如果你想在浮動部分限制在2個位數變成

/^-?\d{0,2}((\.?\d{3})*(,\d{1,2})?|(,?\d{3})*(\.\d{1,2})?)$/ 
          ^^^     ^^^ 

這一點。

0

您可以簡單地使用這個regex..it的相當簡單明瞭..

^(\d*|\d*\,\d*|\d*\.\d*|\d*\.\d*\,\d*|\d*\,\d*\.\d*)$ 
相關問題