2009-12-19 44 views
17

我想顯示兩個文本塊之間的差異。我不想比較文本或單個字符的行,我只想比較由指定字符分隔的單詞(例如'\ n','','\ t')。我的主要推論是,我將比較的文本塊通常沒有多少換行符,並且字母比較可能很難遵循。如何使用c#顯示字詞差異?

我遇到過以下O(ND) logic in C#用於比較行和字符,但我對如何修改它以比較單詞有點不知所措。

此外,我想跟蹤單詞之間的分隔符,並確保它們包含在diff中。所以如果一個空間被一個硬回報所取代,我希望這是一個差異。我正在使用Asp.Net(c#)來顯示整個文本塊,包括刪除的原始文本和添加新的文本(都將突出顯示,以表明他們被刪除/添加)。與這些技術的解決方案,將不勝感激。

任何意見,如何做到這一點表示讚賞。

+0

玩得開心。我的一位同事爲了發佈我們的旗艦產品線而做了這個工作。他受到了充分的挑戰。他用幾篇理論文件來指導他的工作......把握整個寫作質量的時間。 – 2009-12-21 01:57:43

回答

15

微軟在CodePlex上發佈了一個差異項目,允許您執行單詞,字符和行差異。它是根據微軟公共許可證(Ms-PL)許可的。

https://github.com/mmanela/diffplex

+2

DiffPlex允許您定義一個自定義函數,以便如何在文本擴散前對其進行分區。 可以使用方法: DiffResult CreateCustomDiffs(串oldText,串newText,布爾ignoreWhiteSpace,函數功能<字符串,字符串[]>組塊) 其中組塊器告訴DiffPlex哪些原子單位來進行相互比較。 – 2010-04-23 13:51:29

+0

嗨吉姆,我正在尋找類似的解決方案,想知道你的看法,如果使用diffplex作爲解決您的問題? – 2013-11-15 09:38:29

+0

看起來好像我爲我的解決方案使用了http://www.codeproject.com/Articles/11454/A-word-wise-HTML-text-compare-and-merge-engine。我不記得爲什麼我將它用於diffplex,tbh。這個解決方案將已刪除和添加的單詞封裝在已定義的html標籤中,允許您根據需要進行樣式設置。 – 2013-11-16 13:13:11

1

除了少數一般的優化之外,如果您需要在比較中包含分隔符,則本質上是通過字符與中斷進行比較。雖然你可以使用你鏈接的O(ND),但是你會對它做出很多改變,就像你基本寫自己的東西一樣。

差異比較的主要問題是找到延續(如果我刪除一個單詞,但保留其餘部分不變)。

如果您想使用自己的代碼,並且不要寫入已刪除的字符,如果在同一個地方有替換字符,請不要輸出此結果。然後您需要計算「已更改」單詞的最長連續運行,突出顯示該字符串和輸出。

對不起,沒有太多的答案,但對於這個問題,答案基本上是編寫和調整功能。

0

String.Split與'\ n',''和'\ t'作爲分割字符將返回您的文字塊中的單詞數組。

然後,您可以比較每個陣列的差異。一個簡單的1:1比較會告訴你是否有任何單詞被改變。比較:

hello world how are you 

和:

hello there how are you 

會給你world並改爲there

它不會告訴你的是,如果單詞已被插入或刪除,並且仍然需要逐字符解析文本塊,以查看是否有任何分隔符字符已被更改。

+1

恐怕對於大塊文本的String.Split效率不高。 – 2009-12-21 08:25:40