您遇到了一个问题并决定使用正则表达式来解决它——现在您有两个问题。:-)
除了开玩笑,您可以将其分解为两个步骤:
- 识别字符串之间的差异。
- 查看所有差异并找出匹配它们的正则表达式。
对于 (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,但如果您需要更高的精度,这是一个可靠的方向。