我试图逐个区分两个字符串,类似于StackOverflow在版本编辑页面上对两个字符串进行区分的方式.这样做的算法是什么?是否有宝石或其他标准库可以实现这一目标?
编辑:我已经看到其他差异算法(Differ与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 <del class=\"differ\">some</del><ins class=\"differ\">is</ins> <del class=\"differ\">time </del>the <del class=\"differ\">men </del>time when all good men."
请注意单词基于每个单词的差异?我希望通过短语进行更多区分,所以上面的代码输出:
=> "now <del class=\"differ\">some time the men</del><ins class=\"differ\">is the</ins> time when all good men."
我希望得到太多吗?
解决方法
您正在寻找的算法是
Longest Common Subsequence,它可以为您完成大部分工作.
大纲是这些方面的东西.
>按字分割(输入,输出)
>在输入/输出阵列上计算LCS.
>遍历阵列并智能地连接区域.
例如,你说你有:
“你好世界这是一个考验”
和….相比:
“先生你好世界”
LCS的结果是
>“先生”
>“你好”=
>“世界”=
>“这个” –
>“是” –
>“a” –
>“测试” –
现在你在建立时撒上特制的酱汁.您将字符串连接在一起,同时保持对前一个操作的注意.朴素算法只是连接相同动作的部分.
>“先生”
>“你好世界”=
>“这是一个考验” –
最后你将它转换为html:
<ins>mister</ins> hello world <del>this is a test</del>
当然魔鬼在细节上:
>您需要考虑如何处理标签>你比较markdown或html>是否存在UI停止有意义的边缘情况.>你需要特殊处理标点符号.