转换字符串以匹配正则表达式的最少编辑操作数

时间:2017-09-11 12:07:55

标签: regex levenshtein-distance

有没有办法计算最少的操作数(插入,删除,替换),以便将某些字符串转换为匹配某些正则表达式?

例如,将字符串baba转换为匹配正则表达式(ab)+的最小操作数为2:需要将其转换为ababab(+2个字符)或{{1 (-2个字符)。

1 个答案:

答案 0 :(得分:3)

你可以计算字符串和正则表达式之间的Levenshtein distance,但这没有多大意义,因为这会测量两个原始字符串的相似性。

你想要的是测量字符串为了匹配模式而需要经历的操作次数。

这是一个基于图论的解决方案。

首先,我们需要构建表示正则表达式定义的语言的自动机。 Thompson's algorithm会在这里为您提供帮助。

一旦我们构建了这个自动机,我们就可以尽力使表达式匹配,并在它关闭时进行修改。 修改的数量将是从字符串到正则表达式描述的语言的距离。

以下是基本正则表达式的示例:.*a.*。 相应的自动机是:

enter image description here

让我们检查bbb字符串的距离。

  1. 第一个字符是b,因此我们会留在1
  2. 再次
  3. b,所以我们留在1
  4. b,我们留在1
  5. 字符串为空,我们仍未处于最终状态2。 所以我们添加一个a。现在,我们可以转到2
  6. 我们在2,字符串中没有字符,所以我们很好。
  7. 我们对原始字符串进行了一次修改,因此从bbb.*a.*正则表达式的距离为1。 实际上,任何单词与该语言的距离都是01,因为它等同于包含a的单词,即二进制。

    这只是一个想法,它可能有缺陷,但我认为你可以用它做点什么。