C# Regex验证.NET';是非负小数还是空小数?
我正在寻找一个可以验证非负值(.NET类型)的正则表达式,也就是说,如果可以使用C# Regex验证.NET';是非负小数还是空小数?,c#,asp.net,.net,regex,decimal,C#,Asp.net,.net,Regex,Decimal,我正在寻找一个可以验证非负值(.NET类型)的正则表达式,也就是说,如果可以使用decimal.Parse(…)解析非负值,那么它应该被认为是有效的。否则无效 如果它没有通过28-29个有效数字的验证,我没问题——这取决于用户的理智——然后我们有另一个验证层,无论如何都会捕获它 以下是我的想法: ^(?:[1-9]\d*|0)?(?:\.\d+)?$ 问题是它拒绝了1.这是一个有效的数字(您可以从VS中的即时窗口进行验证)。可能是我没有测试的其他边缘情况。请告知 p.S.我包括ASP.NET和
decimal.Parse(…)
解析非负值,那么它应该被认为是有效的。否则无效
如果它没有通过28-29个有效数字的验证,我没问题——这取决于用户的理智——然后我们有另一个验证层,无论如何都会捕获它
以下是我的想法:
^(?:[1-9]\d*|0)?(?:\.\d+)?$
问题是它拒绝了1.
这是一个有效的数字(您可以从VS中的即时窗口进行验证)。可能是我没有测试的其他边缘情况。请告知
p.S.我包括ASP.NET和C#标记,因为这是针对用C#编写的web应用程序的,在C#中,正则表达式被传递给第三方组件,然后第三方组件在客户端(即JS)上工作,因此我无法轻松地将自定义代码放在那里(即
decimal.TryParse
或类似的smth).您可以基于负前瞻性使用此正则表达式,以避免匹配单点:
^(?!\D+$)\+?\d*?(?:\.\d*)?$
为负前瞻,当输入为非数字字符时断言失败(?!\D+$)
允许匹配编号的类型?:\。\d*)?
谢谢-基本测试用例似乎工作正常。您是否也可以添加对前导零(如001)的支持,以及对明确指定加号(如+100)的情况的支持?更正-它接受裸+号,这显然不是数字。是的,使用:Ok,perfect。接受-请不要忘记使用最新的正则表达式更新您的答案并链接到regex101.com-它确实有助于验证常见的边缘情况。测试.NET正则表达式时,最好在.NET专用测试人员处进行测试。Regex101不支持.NET语法。请注意,在.NET正则表达式中,
\d
不等于[0-9]
(请参阅)。不要忘记使用RegexOptions.ECMAScript
标志使\d
与JavaScript中相同的数字匹配。decimal.Parse
也接受前导符号<代码>“+1”是可以解析的非负值。甚至,“-0”
”也是如此decimal.Parse
还接受数千个分隔符:可以解析“1000”
decimal.Parse
对区域性敏感,因此不应硬编码
,除非该区域性也是如此decimal.Parse
接受空格<代码>“100”可以被解析。我可能错过了更多。@hvd,是的,我理解,谢谢你提到这些边缘案例。我并不追求100%的完美,只是试图覆盖99.9%的测试用例。还有培训,以确保人们不会在UI上发疯。我敢肯定,如果你真的想破坏任何程序,它总是有可能的。@hvd,顺便说一句,测试用例是由公认的答案处理的。只要你知道这些边缘情况,并有意识地决定不支持它们,那就好了。只要您只接受decimal.Parse
接受的内容的一个严格子集,就不可能遗漏某些内容,从而中断您的应用程序。