您好我使用此正则表达式验证号码与小数点分隔符和千位分隔符
ets = "\\,";
eds = "\\.";
"^([+\\-]?[0-9" + ets + "]*(" + eds + "[0-9]*)?)$"
但我的两个单元测试用例fail
(它不应该接受),
12.
和1,,2
,有人可以帮忙吗?
注意:这适用于1..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刚刚提供了一个完整的正则表达式,适用于您的意图