2016-07-22 65 views
2

我正在寻找一个可以验证非负数的decimal(.NET类型)的正则表达式,即如果可以使用decimal.Parse(...)解析非负值,那么应该认为它是有效的。否则无效。正则表达式来验证.NET的非负十进制或空白?

我很好,如果它没有通过28-29位有效数字验证 - 依靠用户的理智 - 然后我们有另一个验证层,无论如何都会接收它。

这里是我想出了:

^(?:[1-9]\d*|0)?(?:\.\d+)?$ 

问题是,它拒绝1.这是一个有效的数字(你可以在VS立即窗口验证)。可能是其他边缘情况,我没有测试。请指教。

P.S.我包含ASP.NET和C#标记,因为这是用C#编写的Web应用程序,其中这个正则表达式被传递给第三方组件,然后在客户端(即JS)上工作,所以我不能轻松地将自定义代码那里(即decimal.TryParse或者那样)。

+0

'decimal.Parse'也接受一家领先的标志。 '“+1”是一个可以解析的非负值。所以''-0“',甚至。 'decimal.Parse'还可以接受数千个分隔符:'“1,000”'可以被解析。 'decimal.Parse'是文化敏感的,所以'''不应该被硬编码,除非文化是一样的。 'decimal.Parse'接受空格。 '“100”'可以被解析。我可能错过了更多。 – hvd

+0

@ hvd,是的,我明白,谢谢你提到那些边缘情况。我不试图做到100%完美,只是试图覆盖99.9%的测试用例。还有一些培训可以确保人们不会在用户界面上发疯。如果你真的想要的话,我肯定总能打破任何程序。 – Neolisk

+0

@ hvd,btw +1测试用例由接受的答案处理。 – Neolisk

回答

3

您可以使用基于负前瞻这个正则表达式来避免匹配单点:

^(?!\D+$)\+?\d*?(?:\.\d*)?$ 
  • (?!\D+$)是负先行断言失败时输入非数字字符
  • ?:\.\d*)?允许匹配123.数字的类型。

RegEx Demo 1

RegEx Demo 2

+0

感谢 - 基本测试用例似乎工作正常。你能不能也请加上对前导零的支持,比如001,以及加号被明确指定的情况,比如+100? – Neolisk

+1

更正 - 它接受一个纯粹的+符号,显然不是一个数字。 – Neolisk

+0

Yes use:['^(?!\ D + $)\ +?\ d *?(?:\。\ d *)?$'](https://regex101.com/r/iB1hM8/3) – anubhava