【问题标题】:Find which one of a list of patterns is matched by a given string查找给定字符串匹配的模式列表中的哪一个
【发布时间】:2013-07-14 17:38:45
【问题描述】:

我有一组固定的未知模式字符串,它们使用通配符 *?? = 一个字符,* = 零个或多个字符)。例如:

  • "abcd?"
  • "dogcat*"
  • "*car"
  • "hello*world"

我想从这些模式中生成一些数据结构,它有一个名为findPattern 的方法。该方法接受一个保证最多匹配一个模式的字符串,并返回该字符串匹配的模式(如果有的话)。

在上面的例子中:

  • findPattern("abcde") 返回"abcd?"
  • findPattern("hellocar") 返回"*car"
  • findPattern("edbca") 返回null

保证不会将"dogcatfrogcar" 等字符串作为此方法的输入。

构建数据结构可能会很慢,因为模式集只给出一次。该函数将被同一模式集上的许多字符串调用,因此它需要高效。

我如何做到这一点?

附:我是编程语言不可知论者

【问题讨论】:

  • 我有点没时间详细说明,但您需要创建一个非确定性有限自动机。假设一个具有 n 个字符的模式和一个具有 m 个字符的字符串,您可以直接对您的字符串运行它,每个字符串的成本为 O(n*m),或者将其转换为具有 O(2^n) 的确定性有限自动机状态,但匹配成本为 O(m)。
  • 是的,这似乎是正确的方向。你知道任何实现类似功能的库吗?

标签: string data-structures language-agnostic pattern-matching wildcard


【解决方案1】:

Aho-Corasic 算法旨在查找文本中的多个模式。幸运的是,it is possible to work with '?' wildcards(单个符号)和“如果通配符的数量以常数为界,则可以在线性时间内匹配带通配符的模式”

【讨论】:

  • +1 - 这是个好主意,但对于手头的问题来说太有限了。
【解决方案2】:

我们可以用正则表达式替换每个模式,并尝试解决更普遍的问题。

在这种情况下,我发现了一些有趣的方法:

  1. RE2 library,它允许同时匹配多个正则表达式(只要它们没有反向引用,这里就是这种情况)- 请参阅this answer
  2. Lex 和类似 Lex 的词法分析器 - 请参阅 this answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    相关资源
    最近更新 更多