【问题标题】:Extracting static strings from a regular expression从正则表达式中提取静态字符串
【发布时间】:2012-12-20 21:43:18
【问题描述】:

我正在尝试有效地提取静态字符串(必须匹配给定正则表达式以匹配的字符串)。我已经能够在最简单的情况下做到这一点,但我正在努力寻找更强大的解决方案。


给定一个正则表达式,如下所示

"fox jump(ed|ing|s)"

会给我们

"fox,jumped,jumping,jumps"

另一个例子是

"fox jump(ed|ing|s)?"

这会给我们带来什么

"fox,jump"

因为可选操作符


目前我的算法过于简单。它将从正则表达式的末尾开始并删除组或单个字符,后跟这些运算符“*?”以及“explode”分组的 OR 运算符“(|)”。这工作得很好,但没有考虑到正则表达式的完整语法。您可以将其视为正则表达式的最小集合生成过程(正则表达式可以“生成/必须匹配”的最小字符串集)。

为什么? 我正在尝试将一堆文本与大量正则表达式进行匹配。如果我可以获得这些“必需”的正则表达式的“关键字”列表,我可以对该关键字进行快速文本搜索以过滤我关心的正则表达式(忽略那些我保证不匹配甚至跳过该文本完全有效地不在文本上运行任何正则表达式,因为我们保证在我们的正则表达式集中没有匹配项)。我可以在一个有效的数据结构(Binary Search/Trie/Aho-Corasick)中组织这组关键字,以在我尝试通过有限自动机运行文本之前过滤这组正则表达式。在我尝试运行正则表达式之前,我可以运行非常快速的字符串匹配算法作为过滤阶段。通过这个简单的过程,我已经能够将吞吐量提高很多倍。

【问题讨论】:

  • 为什么要这样做?一些背景可能会带来一些更好的方法来实现你想要做的事情。
  • 在为什么?部分。谢谢!
  • +1 听起来是经过深思熟虑的
  • 首先,您需要解析正则表达式(完整的语法 - 以便您可以识别您不想实现的正则表达式的特征),然后从解析树编写生成器。您可能希望为那些可以匹配无限集或大型输入集的对象设置上限,例如.、否定字符类、*+{n,}。我主要是在这里说话,所以我不知道这是否真的可行,但值得一试。

标签: regex


【解决方案1】:

请参阅库 Xeger,它提供正则表达式将为您提供所有可能匹配的字符串。

您似乎只想保留这些字符串的公共前缀(您说要忽略可选运算符的部分),但如果您这样做,您可能会捕获具有该公共前缀但没有您想要的结尾的字符串(例如您的示例中的“跳跃”)。如果这不是问题,那么只需找到 Xeger 给出的最短字符串,假设可选运算符仅出现在正则表达式的末尾。

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您正在寻找一组单词,使得所有这些单词都是(给定)正则表达式接受的任何单词的(不相交)子字符串。

    我的猜测是这样的集合通常是空的,但仍然可以找到它。

    为了找到这样的集合,我提出了以下算法:

    1. 找到与您的输入正则表达式对应的 FA。
    2. 识别起始状态 S 和接受状态 F 之间的桥 (https://en.wikipedia.org/wiki/Bridge_(graph_theory)。例如,这可以通过移除边 E 并询问是否存在从 S 到 E 的 FA 中移除 E 的路径 -对所有边缘重复此操作。
    3. 在接受运行期间必须命中所有作为桥的边,并且每个边对应于一个输入字母。
    4. 您现在可以通过端到端连接后续桥边来生成所需的单词。

    我认为从算法构造来看,FA(而不是 DFA)足以使其工作。同样,证明会很好,但我认为它应该有效:)

    【讨论】:

      猜你喜欢
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2018-02-23
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多