[英]validate decimal with decimal separator and thousand separator
嗨,我使用此正則表達式驗證帶有小數點分隔符和千位分隔符的數字
ets = "\\,";
eds = "\\.";
"^([+\\-]?[0-9" + ets + "]*(" + eds + "[0-9]*)?)$"
但是我的兩個單元測試用例fail
(它不應該接受)
12.
和1,,2
,有人可以幫助嗎?
注意:這項工作為1..2
。
讓我們看一下使用的實際正則表達式:
^([+\-]?[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]+)?$"
如果我理解正確,則12.匹配,因為您匹配0或1次出現(一個周期,然后0或多次出現0到9之間的任何數字)。 因此,您可能有一個句號,但前面沒有任何內容。
1,2,匹配,因為您匹配0到9之間的任何字符的0或更多出現,或逗號。 因此你可以有0 ,,,,,,,,,,,,,, 0。
如果你想讓最后一個不匹配,請確保在逗號之前最多只有3個數字(在千分隔符中),使用花括號表示一組后允許的次數(即{0,3})數字。
[0-9]{0,3},
@NullUserException剛剛提供了一個完整的正則表達式,適用於您的意圖
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.