比较文本并获得差异

时间:2011-07-18 11:10:18

标签: .net asp.net vb.net text-comparison

我想比较2个字符串(版本1和版本2)并获得我可以自己转换为html的格式的差异,就像你可以查看如何在堆栈上编辑帖子溢出或者像svn跟踪修订版之间的差异......

它必须是完整的托管代码库。

喜欢this JavaScript,但我需要在服务器端进行..

2 个答案:

答案 0 :(得分:8)

谷歌有类似的东西,它可以在C#中使用,但没有更深入地查看它。该演示看起来很酷。

http://code.google.com/p/google-diff-match-patch/

答案 1 :(得分:6)

我有一个类库,我会在下面发布一个链接,但我也会发布它的工作方式,以便你可以评估它是否适合你的内容。

请注意,对于我在下面说的所有内容,如果您将每个字符视为集合的元素,则可以针对任何类型的内容实现下面描述的算法。无论是字符串的字符,文本行,ORM对象的集合。

整个算法围绕longest-common-substring(LCS),是一种递归方法。

首先,算法尝试在两者之间找到LCS。这将是两个版本之间保持不变/相同的最长部分。然后算法将这两部分视为“对齐”。

例如,以下是两个示例字符串的对齐方式:

      This long text has some text in the middle that will be found by LCS
This extra long text has some text in the middle that should be found by LCS
          ^-------- longest common substring --------^

然后它递归地将自身应用于对齐部分之前的部分,以及之后的部分。

最终的“结果”可能看起来像这样(我使用下划线表示其中一个字符串中的“not there”部分):

This ______long text has some text in the middle that ______will be found by LCS
This extra long text has some text in the middle that should____ be found by LCS

然后,作为递归方法的一部分,每个递归调用级别将返回一个“操作”集合,这些操作基于是否存在LCS,或者是否在任一部分中缺少部分,将按如下方式吐出:

  • 如果是LCS,那么它是“复制”操作
  • 如果从第一个缺失,那么这是一个“插入”操作
  • 如果从第二个缺失,那么这是一个“删除”操作

所以上面的文字是:

  1. 复制5个字符(This
  2. 插入extra_(这里显然是代码块删除空格,下划线是空格)
  3. 复制43个字符(long text has some text in the middle that_
  4. 插入should
  5. 删除4个字符(will
  6. 复制16个字符(_be found by LCS
  7. 算法的核心非常简单,如果你愿意,你可以自己实现它。

    我的类库中有一些额外的功能,特别是处理诸如类似的内容之类的内容,这样你不仅可以获得删除或插入操作,而且还可以修改操作,如果你要比较一些东西,比如文本文件中的行,这将非常重要。

    可以在此处找到类库:DiffLib on CodePlex,您也可以在Nuget上找到它以便在Visual Studio 2010中轻松安装。它是用C#编写的.NET 3.5及更高版本,因此它可以用于.NET 3.5和4.0,因为它是二进制版本(所有源代码都在CodePlex上),你也可以在VB.NET中使用它。