从字符串集派生RegExp

Derive RegExp from set of strings

本文关键字:RegExp 派生 字符串      更新时间:2023-10-16

想象一下有一组任意的字符串。我们现在假设,除了几个后续字符之外,它们都是相等的(如果这个假设不成立,我可以返回一个错误)。我现在想要派生一个正则表达式来标识字符串中不同的部分。

输入:"你好,爱丽丝,我是鲍勃输出:"你好(.+),我是鲍勃。"输入:"星期一"、"树"、"狗"输出:错误

也许找到最长的公共子串或Levenstein距离会有所帮助?我还不确定其中一个是否真的适用于我的问题,或者如何使用它们来解决它。

您遇到了一个问题,决定使用regexp来解决它——现在您有两个问题。:-)

抛开玩笑不谈,你可以把它分解为两个步骤:

  1. 识别字符串之间的差异
  2. 看看所有的差异,找出一个正则表达式来匹配它们

对于(1),需要在您的语言中使用diff计算库(如Python中的difflib)来查找两个字符串之间相同区域的列表。如果所有字符串都有公共段,那么将字符串-1与字符串-[2..N]中的每一个进行比较,以分析得到的相同块(在比较每个块的内容及其相对于其他相同块的位置时,你必须聪明)。提取并记录相同块之间的文本。

对于您的示例,每次比较时都会得到两个相同的块:"Hello "", I'm Bob."。相同块之间的文本将是以下字符串:"Alice""John""Josh"

对于(2),最简单的解决方案是将您的发现组合成一个相当字面的正则表达式,该正则表达式由以下部分组成:

Hello+(Alice|John|Josh)+, I'm Bob.

或者,用.*替换所有字符串中相同块之间的任何段。考虑将其作为非贪婪匹配——.*?

我不知道自动机理论,也不能帮助你进行DFA/NFA,但如果你需要更高的精度,这是一个坚实的方向。