有没有办法计算最少的操作数(插入,删除,替换),以便将某些字符串转换为匹配某些正则表达式?
例如,将字符串baba
转换为匹配正则表达式(ab)+
的最小操作数为2:需要将其转换为ababab
(+2个字符)或{{1 (-2个字符)。
答案 0 :(得分:3)
你可以计算字符串和正则表达式之间的Levenshtein distance,但这没有多大意义,因为这会测量两个原始字符串的相似性。
你想要的是测量字符串为了匹配模式而需要经历的操作次数。
这是一个基于图论的解决方案。
首先,我们需要构建表示正则表达式定义的语言的自动机。 Thompson's algorithm会在这里为您提供帮助。
一旦我们构建了这个自动机,我们就可以尽力使表达式匹配,并在它关闭时进行修改。 修改的数量将是从字符串到正则表达式描述的语言的距离。
以下是基本正则表达式的示例:.*a.*
。
相应的自动机是:
让我们检查bbb
字符串的距离。
b
,因此我们会留在1
b
,所以我们留在1
b
,我们留在1 2
。
所以我们添加一个a
。现在,我们可以转到2
。2
,字符串中没有字符,所以我们很好。我们对原始字符串进行了一次修改,因此从bbb
到.*a.*
正则表达式的距离为1
。
实际上,任何单词与该语言的距离都是0
或1
,因为它等同于包含a
的单词,即二进制。
这只是一个想法,它可能有缺陷,但我认为你可以用它做点什么。