2013-10-28 112 views
2

您好我用這個正則表達式驗證數字與小數點分隔符和千個分隔符驗證小數用小數點分隔符和千個分隔符

ets = "\\,"; 
eds = "\\."; 
"^([+\\-]?[0-9" + ets + "]*(" + eds + "[0-9]*)?)$" 

但這fail(它接受當它不應該)爲我的兩個單元測試用例,

12.1,,2,任何人都可以幫忙嗎?

注意:這項工作爲1..2

+0

你能說更多的工作完整的正則表達式?你有什麼嘗試? –

+0

您是否正在考慮1,2和12。您希望匹配字符串嗎? – summerbulb

回答

6

讓我們看看實際的正則表達式,用於:

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

這符合12.因爲你的第二個部分是(\.[0-9]*)。請注意,*表示零個或多個,因此數字是可選的。

這也匹配1,,2,因爲您在第一個字符類[0-9\,]中包含了逗號。所以實際上你的正則表達式也會匹配,,,,,,,,


這可以在沒有正則表達式來解決,但如果你需要一個正則表達式,你可能想是這樣的:

^[+-]?[0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?$ 

拆毀了

^ # match start of string 
[+-]? # matches optional + or - sign 
[0-9]{1,3} # match one or more digits 
(,[0-9]{3})* # match zero or more groups of comma plus three digits 
(\. # match literal dot 
    [0-9]+ # match one or more digits 
)? # makes the decimal portion optional 
$ # match end of string 

要在Java中使用它,你需要這樣的東西:

ets = ","; // commas don't need to be escaped 
eds = "\\."; // matches literal dot 

regex = "^[+-]?[0-9]{1,3}(" + ets + "[0-9]{3})*(" + eds + "[0-9]+)?$" 
+0

非常感謝。這是工作。謝謝 –

+0

嗨,你可以用逗號「,」也是可選的。除'2000'外,這項工作非常有用。它說2000年是不是一個小數,但如果我把2000年,那麼它通過驗證。非常感謝你 –

+1

你可以在逗號後面加一個'?'使其成爲可選項。在我上面的正則表達式中,使用'「^ [+ - ]?[0-9] {1,3}(」+ ets +「?[0-9] {3})*(」+ eds +「 [0-9] +)?$「' – NullUserException

1

如果我理解正確,12.匹配是因爲匹配0或1次出現(一段時間,然後是0到9之間任意數字的0次或多次出現)。所以你可能有一段時間,沒有任何東西在它前面。

1,,2匹配,因爲您匹配0個或更多的0到9之間的任何字符或逗號的匹配。因此你可以有0 ,,,,,,,,,,,,,, 0。

如果您希望最後一個不匹配,請確保在使用大括號表示允許出現的數量(即{0,3} )在一組數字之後。

[0-9]{0,3}, 

@NullUserException只是給那對你的意圖

相關問題