Regex vs Tryparse性能最佳
在我的ASP.net项目中,我需要为用户输入validation一些基本数据类型。 数据类型类似于数字,小数,日期等。
在性能方面我应该采取的最佳方法是什么? 它是通过Regex.IsMatch()
还是通过TryParse()
?
提前致谢。
正如其他人所说,回答这个问题的最佳方法是衡量它;)
static void Main(string[] args) { List meansFailedTryParse = new List (); List meansFailedRegEx = new List (); List meansSuccessTryParse = new List (); List meansSuccessRegEx = new List (); for (int i = 0; i < 1000; i++) { string input = "123abc"; int res; bool res2; var sw = Stopwatch.StartNew(); res2 = Int32.TryParse(input, out res); sw.Stop(); meansFailedTryParse.Add(sw.Elapsed.TotalMilliseconds); //Console.WriteLine("Result of " + res2 + " try parse :" + sw.Elapsed.TotalMilliseconds); sw = Stopwatch.StartNew(); res2 = Regex.IsMatch(input, @"^[0-9]*$"); sw.Stop(); meansFailedRegEx.Add(sw.Elapsed.TotalMilliseconds); //Console.WriteLine("Result of " + res2 + " Regex.IsMatch :" + sw.Elapsed.TotalMilliseconds); input = "123"; sw = Stopwatch.StartNew(); res2 = Int32.TryParse(input, out res); sw.Stop(); meansSuccessTryParse.Add(sw.Elapsed.TotalMilliseconds); //Console.WriteLine("Result of " + res2 + " try parse :" + sw.Elapsed.TotalMilliseconds); sw = Stopwatch.StartNew(); res2 = Regex.IsMatch(input, @"^[0-9]*$"); sw.Stop(); meansSuccessRegEx.Add(sw.Elapsed.TotalMilliseconds); //Console.WriteLine("Result of " + res2 + " Regex.IsMatch :" + sw.Elapsed.TotalMilliseconds); } Console.WriteLine("Failed TryParse mean execution time " + meansFailedTryParse.Average()); Console.WriteLine("Failed Regex mean execution time " + meansFailedRegEx.Average()); Console.WriteLine("successful TryParse mean execution time " + meansSuccessTryParse.Average()); Console.WriteLine("successful Regex mean execution time " + meansSuccessRegEx.Average()); } }
TryParse
和Regex.IsMatch
用于两个根本不同的东西。 Regex.IsMatch
告诉您相关字符串是否与某个特定模式匹配。 它返回是/否答案。 如果可能, TryParse
实际上会转换值,并告诉您它是否成功。
除非你在制作正则表达式时非常小心 , Regex.IsMatch
当TryParse
返回false
时, Regex.IsMatch
可以返回true
。 例如,考虑解析byte
的简单情况。 使用TryParse
您可以:
byte b; bool isGood = byte.TryParse(myString, out b);
如果myString
的值介于0和255之间,则TryParse
将返回true
。
现在,让我们试试Regex.IsMatch
。 让我们看看,这个正则表达式应该是什么? 我们不能只说@"d+"
甚至@d{1,3}"
。指定格式变得非常困难。你必须处理前导0,前导和尾随空格,并允许255
但不是256
。
这只是为了解析一个3位数字。 当您解析int
或long
时,规则会变得更加复杂。
正则表达式非常适合确定表单 。 在确定价值方面,他们很糟糕。 由于我们的标准数据类型都有限制,因此确定其值是确定数字是否有效的一部分。
你最好尽可能地使用TryParse
,如果只是为了省去尝试提出可靠的正则表达式进行validation的头痛。 可能(我几乎可以肯定地说),任何本机类型的特定TryParse
执行速度都比同等正则表达式快。
上面说过,我可能花了更多时间在这个答案上,而不是你的网页将花费在整个生命周期中执行你的TryParse
或Regex.IsMatch
–total。 在网站正在做的其他事情的背景下,执行这些事情的时间非常少,每当你花费在思考问题时就浪费了。
如果可以,请使用TryParse
,因为它更容易。 否则使用正则Regex
。
不要试图让正则表达式做任何事情。
有时候,一个简单的正则表达式会让你获得90%的胜利,并使它能够完成所需的一切,复杂性增长十倍或更多。
然后我经常发现最简单的解决方案是使用正则表达式检查表单,然后依靠好的旧代码进行值检查。
以日期为例,使用正则表达式检查日期格式的匹配项,然后使用捕获组检查各个值的值。
我猜TryParse更快,但更重要的是,它更具表现力。
当您考虑所使用的每种数据类型的所有有效值时,正则表达式会非常难看。 例如,对于DateTime,您必须确保月份在1到12之间,并且该日期在该特定月份的有效范围内。
上述就是C#学习教程:Regex vs Tryparse性能最佳分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1008762.html