正则表达式之间的距离

时间:2010-01-25 09:21:09

标签: regex comparison formal-languages

我们可以计算正则表达式之间的距离吗?

这个想法是以两种正则表达式相似的方式进行测量。

6 个答案:

答案 0 :(得分:5)

您可以使用一些指标:

  1. 有效匹配的长度。一些正则表达式具有固定大小,一些是上限,一些是下限。比较它们的长度或可能长度的相似程度。

  2. 匹配的字符。任何正则表达式都有一组匹配可以包含的字符(可能是所有字符)。比较包含的字符集。

  3. 使用大型文档,查看每个正则表达式的匹配数量以及相同数量的匹配项。

  4. 你在寻找严格的等价吗?

答案 1 :(得分:5)

您可以为两个正则表达式构建deterministic finite-state machines并比较转换。然后可以使用两个过渡的差异来测量这些正则表达式的距离。

答案 2 :(得分:2)

如果您有两个正则表达式并且有一组示例输入,则可以尝试将每个输入与每个正则表达式进行匹配。对于每个输入:

  • 如果两者匹配或两者都不匹配,则得分为0.
  • 如果一个匹配而另一个不匹配,则得分1.

对所有输入求和,这将为您提供正则表达式之间的“距离”。这将让您了解两个正则表达式在典型输入中的不同频率。如果您的样本输入集很大,计算起来会很慢。如果两个正则表达式几乎不能匹配所有随机字符串并且您的预期输入完全是随机的,那么它根本不起作用。例如,如果在随机输入上进行测试,正则表达式'sgjlkwren'和正则表达式'ueuenwbkaalf'可能都不会匹配任何内容,因此该度量标准将表示它们之间的距离为零。这可能是也可能不是你想要的(可能不是)。

您可能能够分析正则表达式的结构,并使用偏向随机抽样来故意匹配比完全随机输入更频繁匹配的字符串。例如,如果两个正则表达式都要求字符串以'foo'开头,则可以确保测试输入始终以foo开头,以避免浪费时间测试您知道两者都会失败的字符串。

总而言之:除非你有一个非常具体的情况,限制输入集和/或限制正则表达式语言,我会说它不可能。如果您对输入和正则表达式有一些限制,则可能会有所限制。请说明这些限制是什么,也许我可以提出更好的建议。

答案 3 :(得分:2)

我想你可以在实际的Regular Experssion字符串之间计算Levenshtein Distance。这当然是衡量两个不同正则表达式字符串之间“距离”的一种方法。

当然,我认为这里根本不需要正则表达式,并且计算正则表达式否则将应用的实际“值”字符串的Levenshtein距离可能会产生更好的结果。

答案 4 :(得分:1)

我认为首先您需要了解自己如何看待两个表达式之间的“差异”。基本上,定义距离度量。

一般情况下,制作会有很大不同。根据您的需要,您可能会看到在某个地方允许一个不同的角色作为一个很大的区别。在另一种情况下,允许任意数量的后续但相同的字符可能不会产生太大的差异。

我还要强调,通常当他们谈论距离函数时,他们会将它们应用于......,好吧,让我们称它们为代币。在我们的例子中,字符序列。你愿意做的是将这种方法应用于那些令牌,而不是将规则应用于多种令牌。我不太确定它是否有意义。

尽管如此,我相信我们可以想到一些东西,但不是一般的,而是针对一个特别且非常有限的案例。你有什么样的例子可以告诉我们吗?

答案 5 :(得分:1)

在SO先前的问题中隐藏着一个答案:Generating strings from regexes。您可以通过使用一个正则表达式生成字符串并检查其中有多少与其他正则表达式匹配来计算(非对称)距离度量。

这可以通过剥离共享前缀/后缀来优化。例如。 a[0-9]*a[0-7]*分享a前缀,因此您可以计算[0-9]*[0-7]*之间的距离。