从字符串集中派生RegExp

时间:2012-08-03 11:06:30

标签: c++ regex string

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

Input:
"Hello Alice, I'm Bob.", "Hello John, I'm Bob.", "Hello Josh, I'm Bob."

Output:
"Hello (.+), I'm Bob."

Input:
"Monday", "Tree", "Dog"

Output:
Error

也许找到longest common substringsLevenshtein distance会有所帮助?我不确定其中一个是否真的适用于我的问题或如何使用它们来解决它。

1 个答案:

答案 0 :(得分:0)

你遇到了问题并决定使用正则表达式来解决它 - 现在你有两个问题。 : - )

除了开玩笑之外,你可以将其分解为两个步骤:

  1. 识别字符串之间的差异。
  2. 查看所有差异并找出匹配它们的正则表达式。
  3. 对于(1),使用您的语言中的差异计算库(如Python中的difflib)来查找两个字符串之间相同区域的列表。如果所有字符串都有公共段,则将string-1与string- [2..N]中的每一个进行比较,以分析生成的相同块(您必须聪明地比较每个块的内容及其相对于其他相同的位置块)。在相同的块之间提取和记录文本。

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

    对于(2),最简单的解决方案是将您的发现组合成一个由字面组成的完全正则表达式:

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

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

    我不知道自动机理论并且无法帮助您使用DFA / NFA,但如果您需要更高精度,这是一个可靠的方向。