使用小数点和千位分隔符验证十进制数。

3

你好,我使用这个正则表达式来验证带有小数点和千位分隔符的数字

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

但是这个程序失败了(它应该被拒绝),对于我的两个单元测试用例:12.1,,2,有人可以帮忙吗?
注意:这适用于1..2

你能再说一些吗?你尝试过什么? - James Kingsbery
你是否考虑将1、2和12作为字符串进行匹配? - summerbulb
2个回答

7

让我们来看一下实际使用的正则表达式:

^([+\-]?[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]+)?$"

你好,您能否将逗号“,”也设为可选项呢?这对于除了“2000”之外的所有内容都非常有效。它说2000不是十进制数,但如果我输入2,000,则可以通过验证。非常感谢。 - Thang Pham
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}),以便在千位分隔符之前只能有最多3个数字。
[0-9]{0,3},

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接