Linux C或C++库来区分和修补字符串

Linux C or C++ library to diff and patch strings?

本文关键字:修补 字符串 C++ Linux      更新时间:2023-10-16

可能的重复:
有办法从C++中区分文件吗?

我有很长的文本字符串,我希望对其进行区分和修补。这是给定的字符串a和b:

string a = ...;
string b = ...;
string a_diff_b = create_patch(a,b);
string a2 = apply_patch(a_diff_b, b);
assert(a == a2);

如果a_diff_b是人类可读的,那将是一个额外的奖励。

实现这一点的一种方法是使用system(3)diffutils调用diffpatchshell命令,并通过管道将字符串发送给它们。另一种方法是自己实现函数(我想原子化地处理每一行,并使用标准的编辑距离n^3算法进行回溯)。

我想知道是否有人知道一个好的Linux C或C++库可以在进程中完成这项工作?

您可以在谷歌上搜索Myers Diff算法的实现。("O(ND)差分算法及其变体")或解决"最长公共子序列"问题的库。

据我所知,C++中diff/patch的情况并不好——有几个库(包括diff-match-patch、libmba),但根据我的经验,它们要么文档记录不足,要么有严重的外部依赖性(例如,diff-match-patch需要Qt4),要么专门用于你不需要的类型(例如,当你需要unicode时,std::string),或者不够通用,或者使用具有非常高的内存要求的通用算法((M+N)^2,其中M和N是输入序列的长度)。

您也可以尝试自己实现Myers算法((N+M)内存需求),但问题的解决方案非常难以理解——预计至少要浪费一周的时间阅读文档。这里提供了一些人类可读的迈尔斯算法解释。

我相信

https://github.com/cubicdaiya/dtl/wiki/Tutorial

可能有你需要的

http://code.google.com/p/google-diff-match-patch/

Diff-Match和Patch库提供了强大的算法来执行同步纯文本所需的操作。

目前有Java、JavaScript、Dart、C++、C#、Objective C、Lua和Python版本。无论语言如何,每个库都具有相同的API和相同的功能。所有版本都有全面的测试线束。