【问题标题】:Efficiently match table of regex to a string有效地将正则表达式表与字符串匹配
【发布时间】:2014-01-31 19:33:18
【问题描述】:

通常,您需要处理一个正则表达式和大量字符串。

我的观点正好相反。我有一个字符串,我想找到所有匹配它的正则表达式。假设我有 1000 万个正则表达式。我不想对字符串进行任何替换或重写,我只是想找到匹配的东西。

我想将这些存储在数据库中。一种粗略的方法是选择所有一千万行并遍历它们。对于每次迭代,应用正则表达式并以某种方式(我对这篇文章也有点不清楚)看看它是否匹配。也许我的正则表达式库有一个函数,我给它一个字符串和一个正则表达式,它会告诉我它是否匹配。如果是这样,那么我打印出正则表达式。

这会很慢。我想知道我是否可以以某种方式将其交给数据库,以便它只返回一个与给定字符串匹配的正则表达式表,从它的 1000 万个表中。

我不知道所使用的数据库,我只是希望它快一点。我不需要它是快速的“自定义汇编器”,而只是“让数据库解决它,这样我就不必在 1000 万行上迭代”快速。

【问题讨论】:

  • 1.为什么? 2. 可以解释为简单字符串的正则表达式的数量没有限制。 foobar 可以与 /.*//.*.*//.*.*.*//.*.*.*.*/ ... 匹配。
  • 不,您肯定需要查看每一个正则表达式(迭代所有 1e7 行)。但是,如果它们形成某种您能够检测到的模式,您可能不需要执行它们中的每一个。那么,正则表达式是什么样的,它们是完全随机的吗?
  • 当然,数据库仍然必须针对所有 1M 正则表达式测试字符串,因此您并没有提高效率,只是将负载从客户端转移到服务器。只有明显的优化是并行化,这应该是微不足道的

标签: regex string


【解决方案1】:

我想知道是否可以以某种方式将其交给数据库,以便它只返回一个与给定字符串匹配的正则表达式表

至少mysql可以做到这一点:

SELECT regex FROM table_with_regexes WHERE
      regex REGEXP someString;

如果您能告诉我们更多关于您的实际问题的信息,也会很有帮助。我不认为你手写了一千万个正则表达式,它们一定是自动生成的 - 告诉我们如何。

【讨论】:

    【解决方案2】:

    在您的情况下,我将分三个步骤进行处理:

    第 1 步:查找第一个 sql 查询

    构建一个 sql 查询来搜索与我的字符串匹配的正则表达式。
    我将从一个小的正则表达式集开始,用于构建 sql 查询。

    第 2 步:如有必要,对其进行改进

    添加更多正则表达式并查看 sql 查询的执行情况。
    我会优化,如有必要,请在此处重写。

    第 3 步:使用选定的数据库优化工具

    我会简单地微调我的 sql 查询以尽快响应。
    我会使用 sql 引擎、索引、并行执行等的提示

    将所有繁重的工作交给数据库是一种好方法,因为 IMO 这是一种优雅而清晰的方法。

    【讨论】:

      猜你喜欢
      • 2019-05-01
      • 2013-10-18
      • 1970-01-01
      • 2022-01-17
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多