Regex(.NET)以多种格式验证任何实数

时间:2016-03-03 16:28:57

标签: c# .net regex validation numbers

我正在尝试使用.NET中的一个正则规则验证不同格式的任何实数。我的意思是以下格式:

点(千)和逗号(十进制)

123 ; 1.234.567 ; 12.345.678 ; 123.456.789 ; 1.234.567,89 ; 1.234,56789 ; 1,2 ; 0,123

逗号(千位)和点(十进制)

1,234,567 ; 12,345,678 ; 123,456,789 ; 1,234,567.89 ; 1,234.56789 ; 1.2 ; 0.123

空格(千位)和点或逗号(十进制)

1 234 567 ; 12 345 678 ; 123 456 789 ; 1 234 567,89 ; 1 234 567.89 ; 1 234,56789 ; 1 234.56789

我更了解正则表达式的基础知识,所以我已经做到了。到目前为止没有成功。

(^|\s)(-|\+|±|\+/-)?(?:(([1-9]{1,3})([,]\d{3})*|[0]?)([\.]\d+)?)|(?:(([1-9]{1,3})([\.]\d{3})*|[0]?)([,]\d+)?)|(?:(([1-9]{1,3})([\s]\d{3})*|[0]?)([\.|,]\d+)?)(\s|$)

任何人可以帮助我或将我链接到解决方案吗?

1 个答案:

答案 0 :(得分:2)

嗯,这可能不是最优的正则表达式:

^\d*$|^(?:\d{1,3}(?:\.\d{3})*(?:,\d{1,5})?)$|^(?:\d{1,3}(?:,\d{3})*(?:\.\d{1,5})?)$|^(?:\d{1,3}(?: \d{3})*(?:[,.]\d{1,5})?)$

但是它完成了这项工作。我会看看如何在不久的将来做一个更好的。这是一个 Live Demo

如果你的输入不是脏(例如:一旦你有一个空格作为一千个分隔符,你就不会得到点,那么逗号,而不是像1 032,354.12)你可以使用这个简单版本:

^\d{1,3}(?:[., ]\d{3})*(?:[.,]\d{1,5})?$

这意味着:

  • \d{1,3}< =从1到3位开始;
  • (?:[., ]\d{3})*< =千位分隔符,重复0到n次后有3位数字;
  • (?:[.,]\d{1,5})?< =小数点分隔符,后面有1到5位数字,0或1次。