2009-12-19 43 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