数字的正则表达式只允许1个逗号和小数

时间:2012-11-07 11:15:26

标签: regex numbers

我的表达式只有有效数字...

^[0-9,-\.]+$

这很好用,但我需要确保最多可以输入1 ,和1 .?这需要迎合不同的文化,因此,.的顺序与我无关。

任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

如果您的正则表达式支持前瞻,您可以使用:

^(?=[^,],[^,]$)(?=[^.]\.[^.]$)[\d,.-]+$

如果没有,那么你可以这样做:

^(?:[\d-]*,?[\d-]*\.?[\d-]*|[\d-]*\.[\d-]*,[\d-]*)$

但我觉得这很难看。

请注意,我更改了您的角色类。 [0-9]可以缩短为\d(请注意,根据您的正则表达式风格,这可能与其他Unicode数字匹配而不仅仅是0-9),.不需要在字符内转义类,-属于字符类的开头或结尾,否则需要进行转义。有趣的是,在你的情况下它甚至没有什么区别,因为,-.创建了从,.的一系列字符(按ASCII顺序)。但是,此范围内的所有字符都是,-.。幸运的你;)

然而,这两个答案实际上只是按照你明确要求做的。您的模式仍然匹配--.--34,---1--2和类似的东西。如果你真的想要将有效数字与不依赖于文化的小数点匹配,你应该使用它来代替:

^-?\d*([.,]\d+)?$

如果你想匹配一个有效数字与.小数点和最多一个,千分隔符(反之亦然),那么:

^-?\d{0,3}(?:(?:,\d{3})?(?:\.\d+)?|(?:\.\d{3})?(?:\,\d+)?)$

我认为真的没有更短的版本。不要担心所有?:。它们只是使子模式不可捕获。由于您无论如何都不需要,通常会显着提高性能。

答案 1 :(得分:0)

这是我可能会使用的。

/^-?\d{0,2}((\.?\d{3})*(,\d+)?|(,?\d{3})*(\.\d+)?)$/
/*

^                   beginning of string
-?                  0 or 1 minus sign
\d{0,2}             0-2 numbers
(
    (\.?\d{3})*     0 or more (3-digit numbers, alternatively preceded by a dot)
    (,\d+)?         0 or 1 (comma and at least 1 number)
|                   or
    (,?\d{3})*      0 or more (3-digit numbers, alternatively preceded by a comma)
    (\.\d+)?        0 or 1 (dot and at least 1 number)
)
$                   end of string

*/

编辑:您可以将其更改为

/^-?\d{0,2}((\.?\d{3})*(,\d{1,2})?|(,?\d{3})*(\.\d{1,2})?)$/
                            ^^^                    ^^^

如果要将浮动部分限制为2位数。

答案 2 :(得分:0)

你可以简单地使用这个正则表达式..这非常简单明了..

^(\d*|\d*\,\d*|\d*\.\d*|\d*\.\d*\,\d*|\d*\,\d*\.\d*)$