2011-03-24 107 views
2

我希望允許用戶輸入數字,小數點前最多3位數字,小數點後有可選小數點,最多可輸入2位數字。文本輸入的正則表達式

我希望它匹配:12,123,123.5,123.55,123 我不希望它匹配:ABC,1234,123.555

我有什麼到目前爲止它: ^ \ d { 0,3}(。?)\ d {0,2} $

目前它仍然匹配1234.我想我需要使用後面的運算符以某種方式,但我不知道如何。

感謝

回答

3

試試這個:

^\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

工作例如:http://rubular.com/r/OOw6Ucgdgq

+0

+1優秀的作品! – alex 2011-03-24 05:45:41

+0

這兩個工作都很好,但我可能會使用第一個,因爲它更容易閱讀!是什麼 ?:運營商在做什麼 – 2011-03-24 05:56:04

+0

@Ciaran - 謝謝。 '(?:)'被設計爲什麼都不做 - 它是一個[非捕獲組](http://stackoverflow.com/questions/3512471/non-capturing-group) - 一個邏輯組,但它的匹配不是' t被添加到正則表達式的結果中。 – Kobi 2011-03-24 06:01:43

0

你必須把小數點和小數可選的組合。在你的正則表達式中,只有十進制數是可選的。 1234被接受,因爲123滿足^ \ d {0,3},不存在小數點滿足(。?),並且4滿足\ d {0,2}。

Kobi的回答爲您提供了正確的正則表達式。

1

也許這(未經測試)

^(?=.*\d)\d{0,3}\.?(?<=\.)\d{0,2}$

編輯 - 上面是錯誤的。

@Kobi的回答是正確的。

可以在他的第一個版本中添加一個lookahead,以確保NOT不僅僅是一個點或空字符串。

^(?=.*\d)\d{0,3}(?:\.\d{0,2})?$

+0

不是。 '\。?(?<= \。)'讀取「可選點,然後檢查您是否在一個點之後」,這在邏輯上與'\ .'相同。一個條件可能在這裏工作,但我懷疑它太多了,並沒有得到普遍支持。即使沒有'(?<= \。)','(?=。* \ d)'也能保護'.',但它仍然可以匹配'12345'。 – Kobi 2011-03-24 05:54:07

+0

哦,我錯過了可選的點。好的趕上! – sln 2011-03-24 06:04:35

+0

@Kobi,「抵禦'。」,但仍然可以匹配'12345'「?你是如何得出這個結論的? '(?=。* \ d)'保證至少有一位數字。 '\。?'是可選的,'(?<= \。)'實際上保護後面的數字,'(?:)'組綁定可選的'.digits'。你應該仔細閱讀。 – sln 2011-03-24 06:35:04

1

這是怎麼回事?

/^\d{0,2}(?:\d\.|\.\d|\d\.\d)?\d?$/