将几个正则表达式合并为一个正则表达式

时间:2009-12-11 15:22:32

标签: regex algorithm language-agnostic

我有几个正则表达式(实际上有几千个),我必须检查一个字符串是否匹配任何这些正则表达式。它效率不高,所以我想将所有这些正则表达式合并为一个正则表达式。

例如,如果有这些正则表达式:

  • 'foo * bar'
  • 'foo * zip'
  • 'zap * bar'

我想获得类似'foo *(bar | zip)| zap * bar'的内容。

是否有一些算法,库或工具可以做到这一点?

4 个答案:

答案 0 :(得分:7)

您可以使用或(|)(以及字符串开头/结尾的锚点)连接正则表达式。

大多数优秀的正则表达式库在从正则表达式构建它之后优化它们的有限状态自动机。例如,PCRE就是这样做的。

此步骤通常会处理您的优化问题,即。它们应用了“手工”所需的大部分转换。

答案 1 :(得分:2)

理论上,正则表达式是一种(非确定性)有限状态自动机;因此它们可以合并和最小化。您可以查看this作为起点。

但请注意,这可能不是最正确的答案。你为什么要处理几千个正则表达式?我只能理解这种事情的主要原因。也许你应该考虑编写一个解析器和一个语法 - 很容易做到(而且语法比regexp更强大)。

答案 2 :(得分:0)

我无法想象,即使可能,最终的正则表达式也会更有效率。

答案 3 :(得分:0)

我非常怀疑它,因为任何这样的工具都必须非常复杂才能处理正则表达式可以组合的所有不同方式。

如果您的正则表达式相对简单,例如在您的示例中,您可能会有一些运气写作自己的运气。