我试图逐个区分两个字符串,类似于StackOverflow在版本编辑页面上对两个字符串进行区分的方式.这样做的算法是什么?是否有宝石或其他标准库可以实现这一目标?
编辑:我已经看到其他差异算法(与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."
Run Code Online (Sandbox Code Playgroud)
请注意单词基于每个单词的差异?我希望通过短语进行更多区分,所以上面的代码输出:
=> "now <del class=\"differ\">some time the men</del><ins class=\"differ\">is
the</ins> time when all good men."
Run Code Online (Sandbox Code Playgroud)
我希望得到太多吗?
您正在寻找的算法是最长公共子序列,它为您完成了大部分工作。
大纲是沿着这些路线的。
例如,假设您有:
“你好世界,这是一个测试”
和....相比:
“世界先生你好”
LCS 的结果是
现在你在建造时撒上特制的酱汁。您将字符串连接在一起,同时注意之前的操作。朴素的算法只是连接具有相同动作的部分。
最后将其转换为 html:
<ins>mister</ins> hello world <del>this is a test</del>
Run Code Online (Sandbox Code Playgroud)
当然,魔鬼在细节中: