使用小数分隔符和千位分隔符验证小数

时间:2013-10-28 17:17:54

标签: java regex

您好我使用此正则表达式验证号码与小数点分隔符和千位分隔符

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

但我的两个单元测试用例fail(它不应该接受),

12.1,,2,有人可以帮忙吗?

注意:这适用于1..2

2 个答案:

答案 0 :(得分: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]+)?$"

答案 1 :(得分:1)

如果我理解正确,12匹配是因为你匹配0或1次出现(一个时期,然后是0到9之间任何数字的0或更多次发生)。所以你可能有一段时间而且没有任何东西在它面前。

1,匹配2,因为您匹配0到9之间的任何字符的0或更多个出现,或者逗号。因此你可以有0 ,,,,,,,,,,,,,, 0。

如果你想让最后一个不匹配,请确保在逗号(千分隔符号)之前最多只能有3个数字,使用花括号表示允许的发生次数(即{0,3})在一组数字之后。

[0-9]{0,3},

@NullUserException刚刚提供了一个完整的正则表达式,适用于您的意图