Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Regex验证.NET';是非负小数还是空小数?_C#_Asp.net_.net_Regex_Decimal - Fatal编程技术网

C# Regex验证.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和

我正在寻找一个可以验证非负值(.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
接受的内容的一个严格子集,就不可能遗漏某些内容,从而中断您的应用程序。