多个Regex.Replace或oreded模式?

时间:2009-03-03 12:42:14

标签: c# regex

再一个正则表达式问题。

效率更高?级联很多Regex.Replace,每个都有一个特定的模式来搜索或者只有一个带有oreded模式的Regex.Replace(pattern1 | pattern2 | ...)?

提前致谢, 费边

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

一般情况下,您可能需要考虑阅读Mastering Regular Expressions,其中突出了一般优化以获得更好性能的想法(尤其是第6章)。

我会说如果你把所有东西放在一个正则表达式中你可能会得到更快的性能,但是最有可能的选择是第一个,然后是第二个最有可能的选项,等等。要注意的第一件事就是回溯。如果您执行类似

的操作
".*"

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

Mastering Regular Expressions一书主要涉及如何避免这种情况。

答案 3 :(得分:1)

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

(我知道这是3月份的一个老问题,但我无法抗拒加上我的2美分:)