不要迷信正则表达式
正好在第一个例子里说到了正在表达式(Regex)对象就顺便一起说了。
很多人以为正则表达式很快,非常快,超级的快。
虽然正则表达式是挺快的,不过千万不要迷信他,不信你看下面的例子。
- //方法1
- public static string ConvertQuot1(string html)
- {
- return html.Replace(“"”, “\””).Replace(“"”, “\””);
- }
- readonly static Regex ReplaceQuot = new Regex(“&(quot|#34);”, RegexOptions.IgnoreCase | RegexOptions.Compiled);
- //方法2
- public static string ConvertQuot2(string html)
- {
- return ReplaceQuot.Replace(html, “\””);
- }
有多少人认为正则表达式比较快的,举个手??
结果为10w次循环的时间 ,即使是10个Replace连用,也比Regex好,所以不要迷信他。
- //方法1
- public static string ConvertQuot1(string html)
- {
- return html.Replace(“0”, “”).Replace(“1”, “”).Replace(“2”, “”).Replace(“3”, “”).Replace(“4”, “”).Replace(“5”, “”).Replace(“6”, “”).Replace(“7”, “”).Replace(“8”, “”).Replace(“9”, “”);
- }
- readonly static Regex ReplaceQuot = new Regex(“[1234567890]”, RegexOptions.IgnoreCase | RegexOptions.Compiled);
- //方法2
- public static string ConvertQuot2(string html)
- {
- return ReplaceQuot.Replace(html, “”);
- }
ConvertQuot1:3518
ConvertQuot2:12479
最后给你们看一个真实的,杯具的栗子。
- Htmlstring = Regex.Replace(Htmlstring, @“<(.[^>]*)>”, “”, RegexOptions.IgnoreCase);
- Htmlstring = Regex.Replace(Htmlstring, @“([\r\n])[\s]+”, “”, RegexOptions.IgnoreCase);
- Htmlstring = Regex.Replace(Htmlstring, @“–>”, “”, RegexOptions.IgnoreCase);
- Htmlstring = Regex.Replace(Htmlstring, @“<!–.*”, “”, RegexOptions.IgnoreCase);
- Htmlstring = Regex.Replace(Htmlstring, @“&(quot|#34);”, “\””, RegexOptions.IgnoreCase);
- Htmlstring = Regex.Replace(Htmlstring, @“&(amp|#38);”, “&”, RegexOptions.IgnoreCase);
- Htmlstring = Regex.Replace(Htmlstring, @“&(lt|#60);”, “<“, RegexOptions.IgnoreCase);
- Htmlstring = Regex.Replace(Htmlstring, @“&(gt|#62);”, “>”, RegexOptions.IgnoreCase);
- Htmlstring = Regex.Replace(Htmlstring, @“&(nbsp|#160);”, ” “, RegexOptions.IgnoreCase);
- Htmlstring = Regex.Replace(Htmlstring, @“&(iexcl|#161);”, “\xa1”, RegexOptions.IgnoreCase);
- Htmlstring = Regex.Replace(Htmlstring, @“&(cent|#162);”, “\xa2”, RegexOptions.IgnoreCase);
- Htmlstring = Regex.Replace(Htmlstring, @“&(pound|#163);”, “\xa3”, RegexOptions.IgnoreCase);
- Htmlstring = Regex.Replace(Htmlstring, @“&(copy|#169);”, “\xa9”, RegexOptions.IgnoreCase);
- Htmlstring = Regex.Replace(Htmlstring, @“&#(\d+);”, “”, RegexOptions.IgnoreCase);
合理使用正则表达式
上面说了正则表达式的效率不高,并不是说就不要用他了,至少正则表达式的作用不仅仅如此而已。
如果一定要用正则表达式的话也需要注意,能静态全局公用的尽量全局公用。
- readonly static Regex regex = new Regex(“[1234567890]”, RegexOptions.Compiled);
意他的第二个参数RegexOptions.Compiled 注释是 指定将正则表达式编译为程序集。这会产生更快的执行速度,但会增加启动时间。
通俗的说就是加了这个枚举,会使得初始化Regex对象变慢,但是执行字符串查找的时候更快, 不使用的话,初始化很多,查询比较慢。
之前测过相差蛮大的 ,代码就不比较了,有兴趣的可以自己试试相差多少。
另外还有一些枚举项,不确定是否对性能有影响,不过还是按规则使用会比较好。
- RegexOptions.IgnoreCase // 指定不区分大小写的匹配, 如果表达式中没有字母,则不需要设定
- RegexOptions.Multiline // 多行模式。更改 ^ 和 $ 的含义…. 如果表达式中没有^和$,则不需要设定
- RegexOptions.Singleline // 指定单行模式。更改点 (.) 的含义…. 如果表达式中没有.,则不需要设定