18

我想显示两个文本块之间的差异。而不是比较文本行或单个字符,我只想比较由指定字符分隔的单词(例如'\n'、''、'\t')。我这样做的主要原因是,我将要比较的文本块通常没有很多换行符,而且字母比较可能很难理解。

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

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

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

任何关于如何实现这一点的建议都值得赞赏。

4

4 回答 4

17

Microsoft 在 CodePlex 上发布了一个差异项目,允许您进行单词、字符和行差异。它是根据 Microsoft 公共许可证 (Ms-PL) 获得许可的。

https://github.com/mmanela/diffplex

于 2010-01-12T21:36:44.810 回答
1

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

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

如果要使用他们的代码以示例开头,不写删除的字符,如果在同一个地方有替换的字符,不要输出这个结果。然后,您需要计算“已更改”单词的最长连续运行,突出显示此字符串并输出。

抱歉,答案不多,但对于这个问题,答案基本上是编写和调整函数。

于 2009-12-19T21:31:23.157 回答
0

使用String.Split'\n'、' ' 和 '\t' 作为分割字符会在你的文本块中返回一个单词数组。

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

hello world how are you

和:

hello there how are you

会给你那个,world然后改成there.

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

于 2009-12-19T21:33:18.753 回答
0

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();
于 2018-05-23T18:41:17.583 回答