我花了好几个小时来解决这个问题,到处寻找...... 我的问题很简单:我们想检查用户输入的数字是否正确。 它可以是整数或小数,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来完成这项工作,但我不能......
答案 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,2
或1.2
,因为这不会对任何事情造成任何伤害,但会使某些事情变得更轻松。 (除非你真的担心成千上万的分隔符,或者有一些深层次的理由不想要第二个。)