我希望允許用戶輸入數字,小數點前最多3位數字,小數點後有可選小數點,最多可輸入2位數字。文本輸入的正則表達式
我希望它匹配:12,123,123.5,123.55,123 我不希望它匹配:ABC,1234,123.555
我有什麼到目前爲止它: ^ \ d { 0,3}(。?)\ d {0,2} $
目前它仍然匹配1234.我想我需要使用後面的運算符以某種方式,但我不知道如何。
感謝
我希望允許用戶輸入數字,小數點前最多3位數字,小數點後有可選小數點,最多可輸入2位數字。文本輸入的正則表達式
我希望它匹配:12,123,123.5,123.55,123 我不希望它匹配:ABC,1234,123.555
我有什麼到目前爲止它: ^ \ d { 0,3}(。?)\ d {0,2} $
目前它仍然匹配1234.我想我需要使用後面的運算符以某種方式,但我不知道如何。
感謝
試試這個:
^\d{0,3}(?:\.\d{0,2})?$
或者更好,以避免僅僅.
:
^(?:\d{1,3}(?:\.\d{0,2})?|\.\d{1,2})$
特別要注意:
^\d{0,3}(\.?)\d{0,2}$
也不正確。使用點可選,它可以匹配12378
:\d{0,3}
匹配123
,(\.?)
不匹配任何內容,並且\d{0,2}
匹配78
。你必須把小數點和小數可選的組合。在你的正則表達式中,只有十進制數是可選的。 1234被接受,因爲123滿足^ \ d {0,3},不存在小數點滿足(。?),並且4滿足\ d {0,2}。
Kobi的回答爲您提供了正確的正則表達式。
也許這(未經測試)
^(?=.*\d)\d{0,3}\.?(?<=\.)\d{0,2}$
編輯 - 上面是錯誤的。
@Kobi的回答是正確的。
可以在他的第一個版本中添加一個lookahead,以確保NOT不僅僅是一個點或空字符串。
^(?=.*\d)\d{0,3}(?:\.\d{0,2})?$
不是。 '\。?(?<= \。)'讀取「可選點,然後檢查您是否在一個點之後」,這在邏輯上與'\ .'相同。一個條件可能在這裏工作,但我懷疑它太多了,並沒有得到普遍支持。即使沒有'(?<= \。)','(?=。* \ d)'也能保護'.',但它仍然可以匹配'12345'。 – Kobi 2011-03-24 05:54:07
哦,我錯過了可選的點。好的趕上! – sln 2011-03-24 06:04:35
@Kobi,「抵禦'。」,但仍然可以匹配'12345'「?你是如何得出這個結論的? '(?=。* \ d)'保證至少有一位數字。 '\。?'是可選的,'(?<= \。)'實際上保護後面的數字,'(?:)'組綁定可選的'.digits'。你應該仔細閱讀。 – sln 2011-03-24 06:35:04
這是怎麼回事?
/^\d{0,2}(?:\d\.|\.\d|\d\.\d)?\d?$/
+1優秀的作品! – alex 2011-03-24 05:45:41
這兩個工作都很好,但我可能會使用第一個,因爲它更容易閱讀!是什麼 ?:運營商在做什麼 – 2011-03-24 05:56:04
@Ciaran - 謝謝。 '(?:)'被設計爲什麼都不做 - 它是一個[非捕獲組](http://stackoverflow.com/questions/3512471/non-capturing-group) - 一個邏輯組,但它的匹配不是' t被添加到正則表達式的結果中。 – Kobi 2011-03-24 06:01:43