Dot-Net

比較文本並獲得差異

  • February 26, 2020

好吧,我想比較 2 個字元串(版本一和版本二)並以我可以自己轉換為 html 的格式獲取差異,就像您可以在堆棧溢出時查看文章是如何在此處編輯的,或者像 svn 跟踪之間的差異修訂……

它必須是完整的託管程式碼庫。

喜歡這個JavaScript,但我需要在伺服器端做它..

我有一個這樣做的類庫,我將在下面發布一個連結,但我也會發布它是如何工作的,以便您評估它是否適合您的內容。

請注意,對於我在下面所說的所有內容,如果您將每個字元視為集合的一個元素,您可以為任何類型的內容實現下面描述的算法。無論是字元串的字元、文本行還是 ORM 對象的集合。

整個算法圍繞最長公共子串(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)

算法的核心很簡單,有了上面的文字,你應該可以自己實現它,如果你願意的話。

我的類庫中有一些額外的功能,特別是處理與更改的文本類似的內容等內容,這樣您不僅可以進行刪除或插入操作,還可以進行修改操作,如果您正在比較某些內容的列表,例如文本文件中的行。

可以在此處找到類庫:GitHub 上的 DiffLib,您還可以在 Nuget 上找到它,以便在 Visual Studio 2010 中輕鬆安裝。它是用 C# 編寫的,適用於 .NET 3.5 及更高版本,因此適用於 .NET 3.5 和 4.0 ,並且由於它是一個二進製版本(儘管所有原始碼都在 GitHub 上),您也可以從 VB.NET 使用它。

Google有類似的東西,它在 C# 中可用,但沒有更深入地研究它。展示看起來很酷。

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

引用自:https://stackoverflow.com/questions/6732018