正则表达式vs Tryparse什么是最好的性能
在我的ASP.net项目中,我需要验证用户输入的一些基本数据类型。数据类型如数字,小数,日期时间等。正则表达式vs Tryparse什么是最好的性能
我应该在性能方面采取什么最好的方法?它是通过Regex.IsMatch()
还是TryParse()
来完成的?
在此先感谢。
至于其他要说的,要回答这个问题的最好办法是测量它;)
static void Main(string[] args)
{
List<double> meansFailedTryParse = new List<double>();
List<double> meansFailedRegEx = new List<double>();
List<double> meansSuccessTryParse = new List<double>();
List<double> meansSuccessRegEx = new List<double>();
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());
}
}
tl; dr对于那些实际需要答案的人来说:'int.TryParse()'总是比'Regex.IsMatch()'快(如此高达一个数量级) 。它也比用RegexOptions.Compiled构造的Regex对象更快。请确保根据您的数字长度使用适当的类(例如'ulong'),并记住'decimal.TryParse()'明显比'int.TryParse()'慢。如果这些都不适合你,'stringVariable.All(char.IsDigit)'在性能方面提供了一个可以接受的中间立场,它也很好,简洁。 – 2014-04-16 16:12:00
我现在没有“全部(char.isdigit)”技巧!我喜欢它 !! – Bruno 2017-09-26 09:07:23
我猜的TryParse更快,但更重要的是,它更表现。
当您考虑您使用的每种数据类型的所有有效值时,正则表达式可能会变得非常难看。例如,对于DateTime,您必须确保月份在1到12之间,并且该日期在该特定月份的有效范围内。
TryParse
和Regex.IsMatch
用于两个根本不同的事情。 Regex.IsMatch
告诉你所讨论的字符串是否匹配某种特定的模式。它返回一个是/否的答案。 TryParse
如果可能,实际上会转换该值,并告诉您它是否成功。
除非你在制定正则表达式是非常小心,Regex.IsMatch
可以返回true
时TryParse
将返回false
。例如,考虑解析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
,这样做只是为了让自己避免想出一个可靠的正则表达式来做验证的头痛。很可能(我几乎可以肯定地说)任何本地类型的特定TryParse
将比等效正则表达式执行得更快。
上面说过,我可能在这个答案上花费了更多的时间,比你的网页在整个生命周期中花费执行你的TryParse
或Regex.IsMatch
花费更多。执行这些事情的时间对于您的网站所做的其他事情来说非常小,无论您花费多少时间思考问题都会被浪费。如果可以的话,使用TryParse
,因为它更容易。否则使用Regex
。
不要试图让正则表达式做所有事情。
有时候,一个简单的正则表达式可以帮助你实现90%的路径,并使它满足你所需要的一切,复杂性增长十倍甚至更多。
然后我经常发现最简单的解决方案是使用正则表达式来检查表单,然后依靠良好的旧代码进行值检查。
以日期为例,使用正则表达式检查日期格式的匹配,然后使用捕获组检查单个值的值。
你真的在意吗?与asp.net相比,这两种方法中的任何一种在性能影响方面都显得微不足道。 – mmix 2011-04-19 10:50:07
使用(Ajax Control Toolik)[http://ajaxcontroltoolkit.codeplex.com/]并很开心。 – 2011-04-19 10:52:58
使用最适合/最容易维护的内容。在这种情况下,性能不是问题:) – 2011-04-19 11:50:09