要对文本文件的进行比较的时候,可以考虑使用google-diff-match-patch,它可以进行比较、匹配和生成补丁的操作,这里将展示一个简单文本比较的例子。
首先我们必须接定好文本比较后的输出。假设我们有两段文本“123456789”和“012356889”,然后我们希望输出他们的“差异”,可是这个“差异”怎么表示呢?
使用google diff的话,这个差异就是从左边的字符串变成右边的字符串所需要的最少的步骤,每个步骤只能做“保持不变”、“插入”或者“删除”操作,如果我们用的是替换操作呢?那么只能是先“删除”后“插入”。例如对我们说到的两个字符串的差异就是:
1. 插入一个0
2. 保持123不变
3. 删除4
4. 保持56不变
5. 删除7
6. 插入8
7. 保持89不变
google diff 使用起来很简单,只需要将它提供的diff_match_patch.java放在你的工程里,然后嗲用它丰富的API就行了,例如对下面的代码:
diff_match_patch dmp = new diff_match_patch();
List<Diff> list = dmp.diff_main("123456789", "012356889");
System.out.println(list);
控制台的输出就是:
[Diff(INSERT,"0"), Diff(EQUAL,"123"), Diff(DELETE,"4"), Diff(EQUAL,"56"), Diff(DELETE,"7"), Diff(INSERT,"8"), Diff(EQUAL,"89")]
google-diff-match-patch的主页是:http://code.google.com/p/google-diff-match-patch/
他的java版本其实只包含diff_match_patch.java和diff_match_patch_test.java两个源文件,关于更详细的API使用方法,可以参考diff_match_patch_test.java,或者这里http://code.google.com/p/google-diff-match-patch/wiki/API
工程还提供了一个Demo在这里: http://neil.fraser.name/software/diff_match_patch/svn/trunk/demos/demo_diff.html
Tip1. 有的时候我们比较两个文件时,只想比较行级的区别,也就是说操作的单位是行而不是字符,这时该怎么做呢?
http://code.google.com/p/google-diff-match-patch/wiki/LineOrWordDiffs 这里做了详细的介绍,并且介绍了怎样将操作的单位变为单词。
Tip2. 有的时候我们的字符串看起来是一样的,但是换行符的不同会导致我们的字符串比较出现问题。这时候我们就需要看一下这些字符串的庐山真面目了,把他们转成Hex形式的字符串。其实操作很简单
String.format("%x", new BigInteger(arg.getBytes(/*YOUR_CHARSET?*/)));
参见 http://stackoverflow.com/questions/923863/converting-a-string-to-hexadecimal-in-java
分享到:
相关推荐
要对文本文件的进行比较的时候,可以考虑使用google-diff-match-patch,它可以进行比较、匹配和生成补丁的操作 google-diff-match-patch这个类库提供了强大的算法用于纯文本内容的差异比较,匹配,打补丁,实现...
使用google-diff-match-patch比较文件 要对文本文件的进行比较的时候,可以考虑使用google-diff-match-patch,它可以进行比较、匹配和生成补丁的操作。
angular-diff-match-patch, 用于google差异匹配补丁的AngularJS包装器 angular-diff-match-patch 这个库只是 google-diff-match-patch的一个包装器。 ( 这里显示一些自定义样式) Angular 2端口要在 Angular 2 项
Go diff - Google的diff-match-patch库的一个Go移植
google-diff_match_patch:Java版本补丁包库文件
基于Diff 工具。 您必须安装 node.js 才能dmp工作。 编写此工具的主要动机是查看 unicode 符号(尤其是西里尔字母)的字母特定差异。 现在有可能: . 用法 ./dmp file1 file2 [--by-words] git 集成 像这样编辑你...
var diffMatchPatch = require ( 'diff-match-patch-node' ) ; diffMatchPatch ( ) . diff_main ( 'test A B' , 'test B B' ) ; // => [ [ 0, 'test ' ], [ -1, 'A' ], [ 1, 'B' ], [ 0, ' B' ] ]
角度差异匹配补丁 该库只是的包装。 (此处显示了一些自定义样式) 角度2端口 如果您希望在Angular 2+项目中使用它,请查看以下端口: 建立 ... diff_match_patch : 'diff-match-patch' } ) , ]
Ace-diff 这是的包装,提供了一个2面板的差异/合并工具,该工具可以可视化两个文档中的差异,并允许用户将更改复制到另一个文档中。 它建立在库的顶部。 该lib处理最困难的部分:文档差异的计算。 Ace-diff只是将...
diff_match_patch-python 一个Python扩展模块,用于包装google-diff-match-patch的C ++实现,以执行非常快速的字符串比较。 google-diff-match-patch是一个Google库,用于计算文本文件之间的差异(< >)。 ...
diff-element first =" I am the very model of a modern Major-General, I've information vegetable, animal, and mineral, I know the kings of England, and I quote the fights historical, From Marathon to...
Diff Match Patch最初建于2006年,旨在为Google文档提供支持。 [ dependencies ] dissimilar = " 1.0 " 编译器支持:需要rustc 1.31+ 界面 这是Rust实现的整个API。 它对借用的字符串进行操作,并且diff算法的...
diff A B >C ,一般A是原始文件,B是修改后的文件,C称为A的补丁文件。 patch A C 就能得到B, 这一步叫做对A打上了B的名字为C的补丁。 patch -R B C 就可以重新还原到A了。 2) 内核补丁 生成 diff -uNr ...
ngx-text-diff 一个简单的文本差异component ,与 Angular 一起使用并基于google diff match patch库。依赖关系差异匹配补丁:^1.0.4所需的包这些软件包将不会自动安装,并且必须在此库之外进行安装。 @ angular / ...
google算法实现文本对比功能,可以基于react的前端组件codemirror进行使用,详细使用方法可以看我的头条号,程序猿peapeay,谢谢
TextModelAnalyze 文本模板解析工具,基于 开发
google-diff-match-patch.zip,diff match和patch库提供了强大的算法来执行同步平原所需的操作
Android Native App集成React Native 详情浏览: : React Native与Android通信 详情浏览: : React Native实现热部署,增量热更新 详情浏览: : React Native(最新版本)实现JsBundle预加载,界面秒开优化 ...
script src =" /bower_components/google-diff-match-patch-js/diff_match_patch.js " > </ script > < script src =" /bower_components/realtime-store/realtime.store.js " > </ script