加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 06:24:19 所属栏目:百科 来源:网络整理
导读:阅读本文 http://www.codinghorror.com/blog/archives/000228.html后,我了解编译正则表达式的好处稍微好一点,但是在个人情况下你会考虑强制使用已编译的Reg Ex吗? 例如,我在循环中使用正则表达式并且正则表达式字符串在每次迭代时使用不同的变量,因此我将通
阅读本文 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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读