算法尽可能快地在众多中选择正确的RegEx

时间:2011-07-07 23:48:48

标签: regex django algorithm

Django Web框架使用正则表达式来分派传入的请求 假设应用程序非常庞大,并且有很多正则表达式,比如数百个。

对于任何传入请求,如何确定哪些正则表达式尽快匹配?迭代遍历列出的正则表达式是疯狂的。

3 个答案:

答案 0 :(得分:5)

一种选择是构造一个可以并行匹配所有正则表达式的确定性自动机。一种方法是:

  1. 使用众多标准转换算法之一将每个正则表达式转换为非确定性自动机。
  2. 引入一个新的启动状态,其中ε-转换到这些自动机的所有启动状态。这有效地创建了一个并行运行所有正则表达式自动机的自动机。确保以不同的方式标记NFA中的每个接受状态,以便清楚每个接受状态对应的正则表达式。
  3. 使用子集构造,将此NFA减少到DFA。在此过程中,当将状态标记为接受时,请记住哪个自动机认为该状态为接受状态。
  4. 生成DFA的表驱动实现。
  5. 现在,无论何时收到新消息,您都可以在该消息上运行表驱动的DFA,它有效地并行运行每个正则表达式,并返回哪些正则表达式(如果有)匹配。这可能会在内存中花费很大,因为生成的DFA可能非常大,但匹配任何传入正则表达式的时间与字符串大小呈线性关系。

答案 1 :(得分:0)

如果您可以控制应用程序,为什么不包含一些指示要使用的正则表达式类型的元数据?您可以使用该元数据然后选择正确的RegEx。

答案 2 :(得分:0)

通过将正则表达式与|连接在一起,将它们合并为一个和命名组:(?< 1> regex1)|(?2 regex2)|(?3 regex3 ...

测试输入一次,并通过检查命名组来确定匹配的正则表达式。