嗨,我使用这个正则表达式来验证带有小数分隔符和千位分隔符的数字
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 刚刚给出了一个完整的正则表达式,可以满足你的意图