1

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

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

这工作正常,但我需要确保最多可以输入1,和 1 ?这需要迎合不同的文化,所以对我来说哪个订单和进来.并不重要。,.

有人能帮忙吗?

4

3 回答 3

1

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

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

如果没有,那么您可以执行以下操作:

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

但我觉得这很丑陋。

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

然而,这两个答案真的只是做你明确要求的。你的模式仍然会匹配--.--34,---1--2和类似的东西。如果您真的想将有效数字与与文化无关的小数点匹配,您可能应该改用它:

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

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

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

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

于 2012-11-07T11:23:21.270 回答
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 位数。

于 2012-11-07T12:00:38.930 回答
0

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

^(\d*|\d*\,\d*|\d*\.\d*|\d*\.\d*\,\d*|\d*\,\d*\.\d*)$
于 2012-11-07T12:01:00.873 回答