Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 将多个正则表达式合并为一个正则表达式_Regex_Algorithm_Language Agnostic - Fatal编程技术网

Regex 将多个正则表达式合并为一个正则表达式

Regex 将多个正则表达式合并为一个正则表达式,regex,algorithm,language-agnostic,Regex,Algorithm,Language Agnostic,我有几个正则表达式(实际上是几千个),我必须检查一个字符串是否与这些正则表达式中的任何一个匹配。它不是很有效,所以我想将所有这些正则表达式合并为一个正则表达式 例如,如果a具有以下正则表达式: “foo*bar” “foo*zip” “zap*bar” 我想获得类似“foo*(bar | zip)| zap*bar”的东西 有什么算法、库或工具可以做到这一点吗?即使可能,我也无法想象生成的正则表达式会更有效。您可以使用or(|)(以及字符串开头/结尾的锚定)连接正则表达式 大多数好的正则表达

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

例如,如果a具有以下正则表达式:

  • “foo*bar”
  • “foo*zip”
  • “zap*bar”
我想获得类似“foo*(bar | zip)| zap*bar”的东西


有什么算法、库或工具可以做到这一点吗?

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

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

大多数好的正则表达式库在从您的正则表达式构建有限状态自动机之后都会对其进行优化。例如,PCRE就是这样做的


这一步通常会解决您的优化问题,也就是说,它们应用了您必须“手工”完成的大多数转换。我非常怀疑这一点,因为任何这样的工具都必须非常复杂,才能处理regex可以组合的所有不同方式

如果您拥有的正则表达式相对简单,例如在您的示例中,那么您可能有幸编写自己的正则表达式。

理论上,正则表达式是(不确定的)有限状态自动机;因此,它们可以合并并最小化。你可以先看一下


不过,请注意,这可能不是最正确的答案。为什么要处理几千个正则表达式?我只能揣测这样一件事到底有多糟。也许你应该考虑编写语法分析器和语法——很容易完成(语法比ReXEPS更强大)。p> 我不同意;正则表达式搜索“foo(?:bar | baz)”将比搜索“foo-bar”和搜索“foo-baz”更快,因为单独搜索需要匹配(或不匹配)两次“foo”部分。-1构建自动机的方式将自动优化许多情况。除此之外,您还可以进一步优化生成的状态机(参见Vlad的答案)。第一步很好,但您不必手动优化:一些正则表达式引擎包含DFA中无法实现的特性,例如任意嵌套括号匹配。在采用这种方法之前,请确保您的起始正则表达式实际上可以转换为DFA,以便您可以将它们与NFA结合,然后将NFA转换回DFA并最小化。