【问题标题】:compare text and get differences比较文本并获得差异
【发布时间】:2011-07-18 11:10:17
【问题描述】:

好吧,我想比较 2 个字符串(版本一和版本二)并以我可以自己转换为 html 的格式获取差异,就像您可以在堆栈上查看帖子的编辑方式一样溢出 或类似 svn 跟踪修订之间的差异......

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

this JavaScript 但我需要在服务器端执行它..

【问题讨论】:

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


【解决方案1】:

Google 也有类似的东西,它在 C# 中可用,但没有深入研究它。不过这个演示看起来很酷。

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

【讨论】:

  • 老实说,我希望这个解决方案的性能和表现比我的实现更好,至少对于文本而言,而且它们也有补丁逻辑。
【解决方案2】:

我有一个这样做的类库,我将在下面发布一个链接,但我也会发布它的工作原理,以便您评估它是否适合您的内容。

请注意,对于我在下面所说的所有内容,如果您将每个字符视为集合的一个元素,您可以为任何类型的内容实现下面描述的算法。无论是字符串的字符、文本行、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 --------^

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

最终的“结果”可能如下所示(我使用下划线表示其中一个字符串中“不存在”的部分):

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)

算法的核心很简单,有了上面的文字,你应该可以自己实现,如果你愿意。

我的类库中有一些额外的功能,特别是用于处理与更改的文本相似的内容等内容,这样您不仅可以获得删除或插入操作,而是还可以修改操作,如果您要比较某些内容的列表(例如文本文件中的行),这将非常重要。

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

【讨论】:

  • 请注意,我的类库没有实现补丁生成或合并逻辑。如果你需要它,你将不得不寻找其他地方。虽然你没有提到你需要任何这样的代码,但我只是想我应该提一下,这样你就不会浪费时间找错树了(如果是错的三棵树的话。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多