【问题标题】:Derive minimal regular expression from input从输入中导出最小正则表达式
【发布时间】:2011-11-27 07:17:23
【问题描述】:

我有一个远程“代理”,它在传递一个字符串时返回“是”或“否”。与这个代理进行通信是昂贵的,所以我希望找到一个库,它可以让我在给出正反馈和负反馈的情况下迭代地构建正则表达式,同时对其构建保持智能。这将允许我在发送端缓存答案。

例如,假设我们用“good”查询代理并收到“yes”。最初派生的正则表达式应该是“好”的。

假设我用“goop”查询并收到“是”。我希望派生的正则表达式是“goo[dp]”,而不是“good|goop”。

等等。

我不需要在派生的正则表达式中进行回溯或任何其他花哨的非线性时间操作。据推测,生成的正则表达式将是引擎盖下的 DFA。有人知道任何能够做到这一点的 c/c++ 正则表达式库吗?或者,为什么这是一个愚蠢的想法以及对我的实际问题的更好解决方案的原因也将是有用的。

【问题讨论】:

  • 我们能否将这个问题简化为“如何找到与给定字符串集匹配的最小正则表达式”?
  • @Kerrek:我粗略地想,但似乎希望高效地添加新字符串并逐步构建它。
  • @R 这是正确的。动态添加新字符串而不是批处理模型很重要。

标签: c++ c regex dfa


【解决方案1】:

好吧,除非我在你的情况下遗漏了一些东西,否则我认为内存足够便宜,可以直接实现一个愚蠢的缓存 - 例如,<std::string, bool> 的 unordered_map。这不仅会更容易构建,而且可能会更快,因为您正在构建哈希映射。唯一的缺点是,如果您要使用大量不同的键查询远程服务,那么这可能不是最好的方法。

【讨论】:

    【解决方案2】:

    您可以使用Trie,而不是正则表达式。

    然后对于每个新字符串,您为每个字符遍历 trie 一个节点。我怀疑您还需要一个标记字符作为字符串结尾 - 一旦您到达该字符,如果节点存在,它就会保存是/否答案。

    【讨论】:

    • 这是摆在桌面上的一个选项。不过,排除重复部分会很好。
    • @tgoodhart 通过分解重复,您的意思是不是为同一个字符设置连续节点,而是只有一个附加计数或整个部分的特里?
    • @pmr 整个部分。理想情况下,生成的正则表达式类似于“abc{2,3}”而不是“abcabc(?:abc)?”。
    猜你喜欢
    • 2015-12-26
    • 1970-01-01
    • 2016-12-11
    • 2011-05-23
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多