正则表达式对我来说似乎总是黑魔法,我从来没有能够自己动手制作它们。 我现在需要一个Reg Exp(用于验证putops),它根据以下规则检查用户输入的数字。
VALID值的一些示例:
1.23
100
1,234
1234
1,234.56
0.56
1,234,567.89
INVALID值:
1.ab
1,2345.67
0,123.45
1.24,687
答案 0 :(得分:3)
您可以尝试以下表达式
^([1-9]\d{0,2}(,\d{3})+|[1-9]\d*|0)(\.\d+)?$
说明:
答案 1 :(得分:1)
^(((([1-9][0-9]{0,2})(,[0-9]{3})*)|([0-9]+)))?(\.[0-9]+)?$
这适用于所有有效数据示例,并且还接受以小数点开头的小数。 (即.61
,.07
等。)
我注意到所有有效小数的示例(1.23
,1,234.56
和1,234,567.89
)在小数点后都有两位数。我不确定这是否是巧合,或者你是否确实要求小数点后正好两位数。 (也就是说,你可能正在处理金钱价值。)我写的正则表达式适用于小数点后的任意位数。 (即1.2345
和1,234.56789
将被视为有效。)如果您需要在小数点后面恰好有两位数,请将正则表达式的结尾从+)?$
更改为{{1 }}
答案 2 :(得分:0)
尝试使用此正则表达式
^(\d{1,3}[,](\d{3}[,])*\d{3}(\.\d{1,3})?|\d{1,3}(\.\d+)?)$
答案 3 :(得分:0)
我知道你要求一个正则表达式,但我认为只要调用double.TryParse()并且如果该方法返回true,则认为你的输入是可接受的。
double dummy;
var isValid=double.TryParse(text, out dummy);
它与您的测试用例完全不符;主要区别在于它对逗号很宽松(所以它会接受两个INVALID输入)。
我不确定你为什么关心,但如果你真的想要逗号严格,你可以做一个预处理步骤,你只检查逗号位置的有效性,然后调用double.TryParse()仅当字符串通过逗号放置测试时。 (如果你想要真正小心,你必须尊重CultureInfo,这样你才能知道分隔符使用了什么字符,以及分隔符之间有多少位数,在你的程序发现自己的环境中)
任何一种方法都会导致代码比正则表达式更“明显正确”。例如,你不必担心你的正则表达式遗漏了一些重要的案例,比如科学记法。