阅读本文之后http://www.codinghorror.com/blog/archives/000228.html我更了解编译正则表达式的好处,但是在个人情况下你会考虑强制使用已编译的Reg Ex吗?
例如,我在循环中使用正则表达式并且正则表达式字符串在每次迭代时使用不同的变量,因此我将通过将此正则表达式标记为编译正确来寻求没有改进?
foreach (field field in fields.Where(x => x.condition)) MatchResults = Regex.Match(request.Message, field.RegularExpression); ...
Jan Goyvaert.. 12
在.NET中,有两种方法可以"编译"正则表达式.正则表达式在被用于查找匹配项之前始终被"编译".当您在没有RegexOptions.Compiled标志的情况下实例化Regex类时,您的正则表达式仍会转换为Regex类使用的内部数据结构.实际匹配过程在该数据结构上运行,而不是表示正则表达式的字符串.只要您的Regex实例存在,它就会持续存在.
如果您多次使用相同的正则表达式,则显式实例化Regex类比调用静态Regex方法更可取.原因是静态方法无论如何都会创建一个Regex实例,然后将其丢弃.它们确实保留了最近编译的正则表达式的缓存,但缓存相当小,并且缓存查找比仅仅引用指向现有Regex实例的指针要昂贵得多.
上面的编译形式存在于使用正则表达式的每种编程语言或库中,但并非所有编程语言或库都提供对它的控制.
.NET框架提供了第二种通过构造Regex对象并指定RegexOptions.Compiled标志来编译正则表达式的方法.该标志的缺失或存在并不表示是否编译了正则表达式.它指示正如如上所述快速编译正则表达式,还是彻底编译,如下所述.
RegexOptions.Compiled真正做的是使用编译为MSIL的正则表达式创建一个新程序集.然后将此程序集加载,编译为机器代码,并成为应用程序的永久部分(运行时).这个过程需要大量的CPU时间,并且内存使用是永久性的.
只有在处理了如此多的数据时,才应该使用RegexOptions.Compiled,用户实际上必须等待正则表达式.如果您无法使用秒表测量速度差异,请不要使用RegexOptions.Compiled.
在.NET中,有两种方法可以"编译"正则表达式.正则表达式在被用于查找匹配项之前始终被"编译".当您在没有RegexOptions.Compiled标志的情况下实例化Regex类时,您的正则表达式仍会转换为Regex类使用的内部数据结构.实际匹配过程在该数据结构上运行,而不是表示正则表达式的字符串.只要您的Regex实例存在,它就会持续存在.
如果您多次使用相同的正则表达式,则显式实例化Regex类比调用静态Regex方法更可取.原因是静态方法无论如何都会创建一个Regex实例,然后将其丢弃.它们确实保留了最近编译的正则表达式的缓存,但缓存相当小,并且缓存查找比仅仅引用指向现有Regex实例的指针要昂贵得多.
上面的编译形式存在于使用正则表达式的每种编程语言或库中,但并非所有编程语言或库都提供对它的控制.
.NET框架提供了第二种通过构造Regex对象并指定RegexOptions.Compiled标志来编译正则表达式的方法.该标志的缺失或存在并不表示是否编译了正则表达式.它指示正如如上所述快速编译正则表达式,还是彻底编译,如下所述.
RegexOptions.Compiled真正做的是使用编译为MSIL的正则表达式创建一个新程序集.然后将此程序集加载,编译为机器代码,并成为应用程序的永久部分(运行时).这个过程需要大量的CPU时间,并且内存使用是永久性的.
只有在处理了如此多的数据时,才应该使用RegexOptions.Compiled,用户实际上必须等待正则表达式.如果您无法使用秒表测量速度差异,请不要使用RegexOptions.Compiled.