2012-11-07 104 views
0

我有这种表情的唯一有效数...换号只允许1逗号和小数点正则表达式

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

这工作得很好,但我需要确保最大的1 ,和1 .能被输入?这需要迎合不同的文化,所以对我来说无关紧要的是,.

任何人都可以帮忙吗?

+1

我会很感激的例子。浮点数是你想要匹配的吗? –

+0

你的正则表达式认为'。---,'是一个有效的数字。我不。 ;)另外,不要忘记正确的逗号类型是依赖于文化的。 – Lucero

+0

我明白你为什么要允许不超过一个小数点分隔符,但为什么只允许一个千位分隔符? “1,000,000.00”不是有效的号码吗?或'1.000.000,00',取决于你的区域? (甚至'1'000'000,00'和其他许多变种可以在现实生活中找到...) –

回答

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+)?)$ 

我不认为有一个更短的版本,真的。不要担心所有的?:。他们只是使子模式不捕获。既然你不需要这个,那通常会显着提高性能。

+0

请注意'\ d'可能不仅仅匹配0-9(unicode数字匹配的不仅仅是这10个十进制数字;你们还有阿拉伯数字等) – Lucero

+0

@Lucero我想这取决于正则表达式的风格,但好点。 –

+0

感谢您提供的所有帮助,我需要做的仅仅是确保输入的有效数字没有任何文字或空格。所以10是可以接受的。 10.00是可以接受的。 10,000.00将是可以接受的以及文化等值10.000,00。 – Stuart

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 

*/ 

编辑:你可以,如果你想在浮动部分限制在2个位数变成

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

这一点。

0

您可以简单地使用这个regex..it的相当简单明了..

^(\d*|\d*\,\d*|\d*\.\d*|\d*\.\d*\,\d*|\d*\,\d*\.\d*)$ 
相关问题