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()); } } 

TryParseRegex.IsMatch用于两个根本不同的东西。 Regex.IsMatch告诉您相关字符串是否与某个特定模式匹配。 它返回是/否答案。 如果可能, TryParse实际上会转换值,并告诉您它是否成功。

除非你在制作正则表达式时非常小心Regex.IsMatchTryParse返回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位数字。 当您解析intlong时,规则会变得更加复杂。

正则表达式非常适合确定表单 。 在确定价值方面,他们很糟糕。 由于我们的标准数据类型都有限制,因此确定其值是确定数字是否有效的一部分。

你最好尽可能地使用TryParse ,如果只是为了省去尝试提出可靠的正则表达式进行validation的头痛。 可能(我几乎可以肯定地说),任何本机类型的特定TryParse执行速度都比同等正则表达式快。

上面说过,我可能花了更多时间在这个答案上,而不是你的网页将花费在整个生命周期中执行你的TryParseRegex.IsMatch –total。 在网站正在做的其他事情的背景下,执行这些事情的时间非常少,每当你花费在思考问题时就浪费了。

如果可以,请使用TryParse ,因为它更容易。 否则使用正则Regex

不要试图让正则表达式做任何事情。

有时候,一个简单的正则表达式会让你获得90%的胜利,并使它能够完成所需的一切,复杂性增长十倍或更多。

然后我经常发现最简单的解决方案是使用正则表达式检查表单,然后依靠好的旧代码进行值检查。

以日期为例,使用正则表达式检查日期格式的匹配项,然后使用捕获组检查各个值的值。

我猜TryParse更快,但更重要的是,它更具表现力。

当您考虑所使用的每种数据类型的所有有效值时,正则表达式会非常难看。 例如,对于DateTime,您必须确保月份在1到12之间,并且该日期在该特定月份的有效范围内。