什么是以与版本页面上的SO相同的方式对两个字符串进行区分的算法?

我试图逐个区分两个字符串,类似于StackOverflow在版本编辑页面上对两个字符串进行区分的方式。 这样做的算法是什么? 是否有gem或其他标准库可以实现这一目标?

编辑:我已经看到其他差异算法(与Ruby不同),他们似乎导致以下结果:

>> o = 'now is the time when all good men.' >> p = 'now some time the men time when all good men.' >> Differ.diff_by_word(o,p).format_as(:html) => "now someis time the men time when all good men." 

请注意单词基于每个单词的差异? 我希望通过短语进行更多区分,所以上面的代码输出:

 => "now some time the menis the time when all good men." 

我希望得到太多吗?

您正在寻找的算法是最长公共子序列,它为您完成大部分工作。

大纲是这些方面的东西。

  1. 按字分割(输入,输出)
  2. 计算输入/输出arrays上的LCS。
  3. 遍历arrays并智能地连接区域。

例如,你说你有:

“你好世界这是一个考验”

和….相比:

“先生你好世界”

LCS的结果是

  • “先生”+
  • “你好”=
  • “世界”=
  • “这个” –
  • “是” –
  • “一个” –
  • “测试” –

现在你在建立时撒上特制的酱汁。 您将字符串连接在一起,同时注意前一个操作。 朴素算法只是连接相同动作的部分。

  • “先生”+
  • “你好世界”=
  • “这是一个测试” –

最后你将它转换为html:

 mister hello world this is a test 

当然魔鬼在细节上:

  • 您需要考虑如何处理标签
  • 你比较markdown或html吗?
  • 是否存在UI停止有意义的边缘情况。
  • 您是否需要特殊处理标点符号。