比较两个字符串或对象并返回它们之间的差异

3
我想在我的网站上实现一种版本历史记录,需要一种比较字符串或对象键的方法。例如:
原始字符串/对象键:The quicker brown fox 修订后的字符串/对象键:The quick brown fox jumped over the lazy rabbit 修订:添加了"jumped over the lazy rabbit",删除了"er"
我只想在我的历史记录表中保存修订版。我不知道从哪里开始,所以任何启发我或提供建议的想法都将不胜感激。
我知道find()函数,并且我认为它是一个很好的候选解决方案,但我不知道如何将其可视化,因为它比较字符串“批发”这样说。

正如@oragepips所指出的那样,这不是一个简单的问题。例如,在您的示例中,说“棕色的狐狸跳过了”被添加,“棕色的狐狸”被删除,并且“懒兔子”被添加也是正确的(尽管可能不太准确)。建议查看第三方工具。 - Ben Doom
2个回答

7
您需要一个差异算法(我已将问题标记为此),强烈建议您不要尝试自己编写。我曾尝试过,但失败了,因为这是一个NP完全问题,不容易理解。相反,请查看diff-match-patch,它具有JavaScript和Java实现,可用于客户端(演示)或服务器端处理。如果您需要进行HTML差异比较,请查看daisydiff,但请注意,HTML/XML差异比较确实是一种痛苦的体验(请参见此页面以获取一些原因)。
可能最重要的差异比较工具是GNU diff,它还具有Java实现(找到“GNU Diff for Java”)。该算法比diff-match-patch(dmp)更加优化,尽管dmp似乎一直在改进,因此,如果您需要比较非常大的字符串(例如兆字节),那么GNU算法可能是更好的选择。

orangepips,这很完美。唯一的问题是它是Java编写的,我不知道如何将其集成到ColdFusion应用程序中!如果您有任何教程,请分享。 - Mohamad
不,.zip 文件中有一个 JavaScript 版本和一个提供示例用法的 .html 文件。我包含的演示链接使用了 JavaScript 版本。 - orangepips
1
@Mel,查看你的CF Web Dev指南,一般情况下将Java集成到CF应用程序中非常容易。 - Henry

1

好的,那么this呢?不确定它是否像您想要的那样处理普通字符串,但它似乎解决了您对如何处理Java集成部分的困惑(因为它已经编写好了)。至少应该指引您朝着正确的方向前进。


很好知道,Todd。我会研究一下这个。我意识到我不需要只存储差异部分,而是应该存储整个修订字符串,并使用JS版本的diff-match-patch在客户端显示更改。 - Mohamad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接