【问题标题】:Regex fast iteration MatchCollection indices正则表达式快速迭代 MatchCollection 索引
【发布时间】:2014-10-31 21:25:11
【问题描述】:

如何最有效地迭代每个 Match 的 MatchCollection Index 属性?我的代码中有很多 Regex 对象,我需要遍历所有 Match 索引,但在 VS 分析器中,我看到一个简单的 Linq 查询

regex.Matches(text).Cast<Match>().Select(x => x.Groups[1].Index)

和内部函数:

IEnumerator.MoveNext()

几乎占用了一半的执行时间。有什么方法可以硬编码吗?也许指针会跳过内部结构或其他一些方法来避免IEnumerable&lt;T&gt;

【问题讨论】:

  • 我强烈怀疑花费最多时间的部分实际上是:regex.Matches(text)(正则表达式匹配本身)
  • 但是分析器说的 MoveNext 是最消耗量的功能...
  • @eocron 由于延迟执行,您的正则表达式在您开始枚举之前不会运行。但真正的问题并不存在。

标签: c# regex linq


【解决方案1】:

正如@L.B 已经指出的那样,您的 Linq 表达式受制于deferred execution。也就是说,如果您在每个步骤中迭代您的 MatchCollection,您的 Regex 将被执行以提供下一个 Match,这很可能是您观察到的性能影响。

事实上,Regex 很重。但是您可以进行一些调整来提高性能(请参阅Regexbest practices)。

您可能想尝试的是应用已编译的Regex

Regex comp10 = new Regex(pattern, RegexOptions.Compiled);

【讨论】:

  • thx,我忘记了延迟执行 :) 我在 uestion 之前很久就添加了编译选项,我认为这是一个瓶颈......如果我有足够快的 regexlike 自动机索引:(
猜你喜欢
  • 2011-12-24
  • 2011-05-16
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2013-05-24
  • 2020-06-08
  • 2018-08-29
相关资源
最近更新 更多