.net – 我应该何时使用已编译的正则表达式进行解释?

前端之家收集整理的这篇文章主要介绍了.net – 我应该何时使用已编译的正则表达式进行解释?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
阅读本文 http://www.codinghorror.com/blog/archives/000228.html后,我了解编译正则表达式的好处稍微好一点,但是在个人情况下你会考虑强制使用已编译的Reg Ex吗?

例如,我在循环中使用正则表达式并且正则表达式字符串在每次迭代时使用不同的变量,因此我将通过将此正则表达式标记为编译正确来寻求没有改进?

嗨,谢谢你的答案,我的实际代码并不简单,并且受到了动态构建的RE的影响,所以我不能包含它,所以对于所有密集的目的,这里有一个示例,它演示了我的方法

foreach (field field in fields.Where(x => x.condition))
    MatchResults = Regex.Match(request.Message,field.RegularExpression);
...
在.NET中,有两种方法可以“编译”正则表达式.正则表达式在被用于查找匹配项之前始终被“编译”.当您在没有RegexOptions.Compiled标志的情况下实例化Regex类时,您的正则表达式仍会转换为Regex类使用的内部数据结构.实际匹配过程在该数据结构上运行,而不是表示正则表达式的字符串.只要您的Regex实例存在,它就会持续存在.

如果您多次使用相同的正则表达式,则显式实例化Regex类比调用静态Regex方法更可取.原因是静态方法无论如何都会创建一个Regex实例,然后扔掉它.它们确实保留了最近编译的正则表达式的缓存,但缓存相当小,并且缓存查找比简单地引用指向现有Regex实例的指针要昂贵得多.

上述编译形式存在于使用正则表达式的每种编程语言或库中,但并非所有编程语言或库都提供对它的控制.

.NET框架提供了第二种通过构造Regex对象并指定RegexOptions.Compiled标志来编译正则表达式的方法.此标志的缺失或存在并不表示是否编译了正则表达式.它表示正如如上所述快速编译正则表达式,还是彻底编译,如下所述.

RegexOptions.Compiled真正做的是使用编译为MSIL的正则表达式创建一个新程序集.然后将该程序集加载,编译为机器代码,并成为应用程序的永久部分(运行时).此过程需要大量的cpu时间,并且内存使用量是永久性的.

只有当您使用它处理如此多的数据以至于用户实际上必须等待正则表达式时,才应该使用RegexOptions.Compiled.如果您无法使用秒表测量速度差异,请不要使用RegexOptions.Compiled.

猜你在找的正则表达式相关文章