【问题标题】:Multiple Regex.Replace or or'ed pattern?多个 Regex.Replace 或 or'ed 模式?
【发布时间】:2009-03-03 12:42:14
【问题描述】:

又是一个正则表达式问题。

什么更有效?级联许多 Regex.Replace 与每个特定模式搜索或仅一个 Regex.Replace 与 or'ed 模式 (pattern1|pattern2|...)?

提前致谢, 费边

【问题讨论】:

  • 基于可读性的效率是多个替换而不是一个。正则表达式很难阅读,如果您添加额外的语句,它将无法阅读。
  • 所有正则表达式都被预编译并存储在一个数组中。我循环并应用所有替换。 or'ed 版本是用相同的数组构建的,所以这里的可读性并不重要。

标签: c# regex


【解决方案1】:

我的回答很烂,但是:这取决于。你有多少?您节省的几毫秒真的会有所作为吗?哪种解决方案最易读、最容易维护、最具可扩展性?

根据您手头的具体要求尝试这两种方法,您就会看到。你可能会感到惊讶。

【讨论】:

    【解决方案2】:

    这取决于您的文本有多大以及您期望的匹配数。如果可能的话,在正则表达式的前面放置一个文本文字或锚点(例如 ^)。 .NET Regex 引擎将对此进行优化,以便它使用快速的 Boyer-Moore 算法(可以跳过字符)而不是查看每个字符的标准 IndexOf 来搜索该文本。如果您在前面有多个带有文字文本的模式,则可以进行优化以创建一组可能的起始字符。其他所有内容都会很快被忽略。

    一般而言,您可能需要考虑阅读Mastering Regular Expressions,其中重点介绍了一般优化以获得更好性能的想法(尤其是第 6 章)。

    我想说,如果您将所有内容都放在一个正则表达式中,您可能会获得更快的性能,但首先放置最有可能的选项,然后是第二个最有可能的选项,等等。要注意的第一件事是回溯。如果你做类似的事情

    ".*"
    

    要匹配带引号的字符串,请意识到一旦找到第一个“,那么默认情况下它总是会走到行尾,然后开始备份,直到找到另一个”。

    Mastering Regular Expressions 这本书深入探讨了如何避免这种情况。

    【讨论】:

    • 经过一些基准测试后,单独的正则表达式效率更高。另外,它们都以相同的模式开始和结束,所以我在处理之前先看看是否找到了通用模式,否则我就跳过这个字符串。
    【解决方案3】:

    完全取决于模式和实现逻辑——如果简单(我想大多数现实世界的情况都是这样),正则表达式会更快,如果可能是复杂的多个操作,但如果在这种情况下,基准测试就是答案实际上很重要。

    否则它会相对如此接近你不应该关心,过早优化等等。

    【讨论】:

      【解决方案4】:

      我很惊讶您的基准测试显示使用多个单独的表达式会更快,我很想看看您正在使用的正则表达式的示例。基本的正则表达式(即没有像回溯这样的高级功能)可以编译为“有限状态机”,其速度相对于被搜索字符串的长度是 O(n),而 不相关 是模式。因此,运行 10 个不同的正则表达式平均需要比使用“|”组合这些模式的单个正则表达式长 10 倍。

      (我知道这是 3 月份的一个老问题,但我忍不住加了我的 2 美分 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-09
        • 2010-12-09
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        相关资源
        最近更新 更多