有没有办法按特异性对正则表达式列表进行排序?



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

根据它们的特异性/严格性

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

但是

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

哪一个比另一个更不具体?

thank you in advance

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

你上面提到的严格性就变成了子集关系:如果L(A)L(B)的适当子集,则定义RE A比RE B更严格。这消除了歧义,比如"same"RE的同义词:它们完全相同,因为它们具有相同的规则语言。

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

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

第一个是利用抽运引理。事实证明,对于任何正则表达式,如果它匹配一个足够长的字符串,那么它也必须匹配一个更长的字符串,该字符串可以通过重复某些子部分从第一个构造。您可以问没有任何重复片段的最长匹配字符串的长度是多少,并将其作为度量。这可能会尊重(嵌入)偏序,也可能不会。

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

正如第二个示例所示,不能对正则表达式进行完全排序,只能对正则表达式进行部分排序。

更糟糕的是,有几十种方法可以编写相同的正则表达式:[ab]b vs (ab|bb), aa* vs a+。因此,即使决定两个regexp是否相等也不是一件简单的任务。

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

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

最新更新