C#正则表达式为法语小数

时间:2010-12-09 16:09:05

标签: c# .net regex

我花了好几个小时来解决这个问题,到处寻找...... 我的问题很简单:我们想检查用户输入的数字是否正确。 它可以是整数或小数,comas不是点,而是昏迷后的无限数。

我试过这个

 Regex decimalRegex = new Regex(@"\d+(,\d+)?");

我认为这样可以,但例如:如果我尝试使用IsMatch,则2,324e为真。 此外它在点和昏迷之间没有区别所以这个2.23可以和我的正则表达式的IsMatch一起使用。

但是我想要允许这样的例如数字2:

2
2,2
2,3243241428483248
31324,232332 (infinite numbers before and after)

并禁止:

2.2
2,2434214e (any letter)

并且理想情况下禁止(我认为?会做的但是却没有)......

2,2,2 or
2.2.2

只允许一个昏迷...... 否则我就是法国文化

正则表达式的任何冠军会有什么建议吗? 我甚至下载了Expresso来完成这项工作,但我不能......

3 个答案:

答案 0 :(得分:9)

您需要锚定表达式:

Regex decimalRegex = new Regex(@"^\d+(,\d+)?$");

在开始时没有^而在结尾没有$,表达式可以匹配您正在测试的字符串的任何子字符串。锚点一起禁止子串匹配。

换句话说,您的原始表达式将匹配包含至少一个数字的任何字符串。

答案 1 :(得分:5)

为什么在设置正确的文化后不使用Int32.TryParse()或Double.TryParse()?在你的问题中,你已经说过一个Int或一个Double,但后来说了一个'逗号后的无限数字'。这些可能不是Ints或Doubles,具体取决于它们的范围,TryParse也会对你进行范围检查......

答案 2 :(得分:1)

你几乎走在正确的轨道上;您需要的正则表达式为@"^(\d+(,\d*)?|,\d+)$" ^$强制正则表达式在字符串的开头和结尾处匹配,因此不允许任何额外的内容。如果没有这些,你的正则表达式将匹配1,2中的1,2e,并认为这是正常的 - 这也是2,2,2正在工作的原因,因为它与第一个2,2匹配并忽略了休息。这就是2.2.2匹配的原因 - 正则表达式匹配2,而忽略了其余部分。基本上,锚点非常有用:-)我改变的另一件事是添加,\d+子句,它允许您匹配,123形式的数字。如果您不想这样,请将其取出(@"^\d+(,\d*)?$")。同样,如果您不想与123,匹配,请将*更改为+@"^\d+(,\d+)?$")。

如果您对其他解决方案持开放态度,可以使用Ian's advice并使用现有功能;我还建议将,替换为[.,],以便人们可以输入1,21.2,因为这不会对任何事情造成任何伤害,但会使某些事情变得更轻松。 (除非你真的担心成千上万的分隔符,或者有一些深层次的理由不想要第二个。)