【问题标题】:there's a way to sort a regular expressions list by specificity?有没有办法按特异性对正则表达式列表进行排序?
【发布时间】:2011-12-06 12:31:39
【问题描述】:

我正在寻找可以对正则表达式列表进行排序的东西, 或一些文档和研究,

根据他们的特殊性/严格性

/[a-z]+/           // most strict
/[a-z0-9]+/
/[a-z0-9èòà]+/     // less strict
/.*/

但是怎么样

/[a-z]+ABC/
/[a-z0-9]+/

哪一个比另一个不那么具体?

提前谢谢你

【问题讨论】:

  • 嗯,不知道?更具体的是什么?你如何比较两个正则表达式?它们是为了匹配不同的东西还是?
  • 您可以自己定义一个特异性:我将其定义如下:Regex1 比 Regex2 更具体,如果 Regex1 匹配的所有字符串也由 Regex2 匹配(即,如果 L(regex1) 是L(正则表达式2))。如果两个子集都不是另一个子集,我会称它们为“无与伦比”。
  • @phimuemue ... 第二个例子就是这种情况。

标签: regex algorithm theory computation-theory


【解决方案1】:

假设您谈论的是纯正则表达式,而不是疯狂的 perl 东西,您可以根据正则表达式接受的字符串集定义与您的问题匹配的 部分 顺序(即,将正则表达式视为正则语言)。

鉴于正则语言的差异、交集和空性是可判定的问题,这意味着有一些算法会告诉你一个表达式是否接受另一个表达式接受的所有字符串。

【讨论】:

    【解决方案2】:

    可以将正则表达式等同于它匹配的字符串集(称为“正则语言”。)如果我们的正则表达式命名为E,我们就称其匹配字符串为L(E)

    您在上面提到的严格意义上的严格性成为子集关系:如果L(A)L(B) 的真子集,则将 RE A 定义为比 RE B 更严格。这消除了歧义,例如“相同”RE 的同义词:它们之所以相同,正是因为它们具有相同的常规语言。

    正如@yi_H 指出的那样,RE 语言(在某些常见字母表上)的子集关系形成了部分排序。你听起来像你想要一个总订购。如果是这样,您可以规定可接受的总排序应该嵌入由子集关系表示的部分排序。

    对于如何建立总排序,我没有明确的答案,但我想到了两种方法。

    首先是利用pumping lemma。事实证明,对于任何 RE,如果它匹配一个足够长的字符串,那么它还必须匹配一个更长的字符串,该字符串可以通过重复某些小节从第一个构造出来。您可以询问没有任何此类重复段的最长匹配字符串的长度是多少,并将其作为您的指标。也许这尊重(嵌入)部分排序,也许它没有。

    另一个是考虑 RE 的状态机上的图形转换。我怀疑(但我没有任何参考)如果 RE A 比 RE B 更严格,那么 B 的自动机将可以通过折叠状态或一些类似的简化从 A 中计算出来行动。您可以将度量定义为 RE 的最小自动机中的状态数。

    【讨论】:

    • 我相信 Almeida 和其他人的一系列论文使用 Brzozowski 的正则表达式导数概念来执行正则表达式的相等性和顺序的有效测试。我认为这对于 OP 来说是一个更好的解决方案,因为没有人愿意实现 NDA/DFA/REGEXP 算法。
    • 太棒了,听起来好像有人已经考虑过了。论文的参考文献?
    • 好吧,我找不到我想的关于包含的论文,但我相信 Almeida 的论文“Testing the Equivalence of Regular Languages”和 Antimirov 的论文“Rewriting Extended Regular Expressions”谈论了测试对等和包容。我认为我正在考虑的论文的标题是 Antimirov 的“Partial Derivatives...”。 hackage 上有一个名为 regexpr-symbolic 的 Haskell 实现。
    【解决方案3】:

    正如您的第二个示例所示,您不能对正则表达式进行完全排序,因此只有 partial order 是可能的。

    更糟糕的是,有很多方法可以编写相同的正则表达式:[ab]b vs (ab|bb)aa* vs a+。所以即使判断两个正则表达式是否为equivalent 也不是一件容易的事。

    【讨论】:

    • 好评论,但这不是答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2021-03-19
    • 2019-06-28
    • 2013-02-26
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    相关资源
    最近更新 更多