如何使用c#显示单词差异?

我想展示两个文本块之间的差异。 我不想比较文本行或单个字符,而只想比较由指定字符分隔的单词(例如’\ n’,”,’\ t’)。 我的主要理由是,我将要比较的文本块通常没有很多换行符,字母比较可能很难遵循。

我在C#中遇到了以下O(ND)逻辑,用于比较行和字符,但我对如何修改它来比较单词感到很茫然。

另外,我想跟踪单词之间的分隔符,并确保它们包含在差异中。 因此,如果一个空间被一个硬回来所取代,我希望它能成为一个差异。

我正在使用Asp.Net(c#)显示整个文本块,包括已删除的原始文本和添加的新文本(两者都将突出显示以显示它们已被删除/添加)。 可以理解与这些技术一起使用的解决方案。

任何关于如何实现这一点的建议表示赞赏。

微软已经在CodePlex上发布了一个diff项目,允许你进行单词,字符和行差异。 它根据Microsoft Public License(Ms-PL)获得许可。

https://github.com/mmanela/diffplex

除了一些常规优化之外,如果您需要在比较中包含分隔符,那么您实际上是通过与中断的字符比较来进行字符。 虽然您可以使用您链接的O(ND),但您将对它进行尽可能多的更改,就像您基本上编写自己的一样。

差异比较的主要问题是找到延续(如果我删除一个单词,但其余部分保持不变)。

如果要使用代码,请从示例开始,不要写入已删除的字符,如果在同一位置有替换字符,请不要输出此结果。 然后,您需要计算“已更改”单词的最长连续运行,突出显示此字符串和输出。

对不起,这不是一个答案,但对于这个问题,答案基本上是编写和调整function。

使用’\ n’,”和’\ t’作为拆分字符的String.Split将返回您的文本块中的单词数组。

然后,您可以比较每个数组的差异。 简单的1:1比较会告诉您是否有任何单词被更改。 比较:

 hello world how are you 

和:

 hello there how are you 

会给你那个world并改变到there

它不会告诉你的是,如果插入或删除了单词,你仍然需要逐个字符地解析文本块以查看是否有任何分隔符被更改。

string string1 =“你好世界你好吗”; string string2 =“你好,你好吗”;

  var first = string1.Split(' '); var second = string2.Split(' '); var primary = first.Length > second.Length ? first : second; var secondary = primary == second ? first : second; var difference = primary.Except(secondary).ToArray();