如何在Java中执行字符串Diffs?

时间:2008-09-25 10:20:40

标签: java diff

我需要在Java字符串之间执行Diffs。我希望能够使用原始字符串和diff版本重建字符串。有没有人用Java做过这个?你用什么图书馆?

String a1; // This can be a long text
String a2; // ej. above text with spelling corrections
String a3; // ej. above text with spelling corrections and an additional sentence

Diff diff = new Diff();
String differences_a1_a2 = Diff.getDifferences(a,changed_a);
String differences_a2_a3 = Diff.getDifferences(a,changed_a);    
String[] diffs = new String[]{a,differences_a1_a2,differences_a2_a3};
String new_a3 = Diff.build(diffs);
a3.equals(new_a3); // this is true

8 个答案:

答案 0 :(得分:46)

这个库似乎可以解决问题:google-diff-match-patch。它可以根据差异创建补丁字符串,并允许重新应用补丁。

修改:另一种解决方案可能是https://code.google.com/p/java-diff-utils/

答案 1 :(得分:21)

Apache Commons有String diff

org.apache.commons.lang.StringUtils

StringUtils.difference("foobar", "foo");

答案 2 :(得分:4)

正如托尔斯滕所说,你可以使用

org.apache.commons.lang.StringUtils;

System.err.println(StringUtils.getLevenshteinDistance("foobar", "bar"));

答案 3 :(得分:4)

java diff utills库可能很有用。

答案 4 :(得分:1)

如果你需要处理大量数据之间的差异并有效地压缩差异,你可以尝试xdelta的Java实现,后者又为二进制差异实现RFC 3284(VCDIFF)(也应该使用字符串)

答案 5 :(得分:0)

使用Levenshtein distance并从算法构建的矩阵中提取编辑日志。维基百科的文章链接到几个实现,我确信其中有一个Java实现。

Levenshtein是Longest Common Subsequence算法的一个特例,你可能也想看一下。

答案 6 :(得分:0)

Apache Commons Text现在具有StringsComparator

StringsComparator c = new StringsComparator(s1, s2);
c.getScript().visit(new CommandVisitor<Character>() {

    @Override
    public void visitKeepCommand(Character object) {
        System.out.println("k: " + object);
    }

    @Override
    public void visitInsertCommand(Character object) {
        System.out.println("i: " + object);
    }

    @Override
    public void visitDeleteCommand(Character object) {
        System.out.println("d: " + object);
    }
});

答案 7 :(得分:-7)

datetime >= '2016-01-01' AND datetime < '2016-12-01'