1

可以标记为重复,但我还没有找到合适的解决方案。

我需要编写一个函数,逐字比较 2 段文本,并打印出显示添加/删除/更改的单词的文本。例如:

StringOriginal = "我是 Tim,今年 27 岁"

StringEdited = "我是 Kim,我没那么老"。

结果:我是Tim Kim,我27 岁,还不算老。

我发现的大多数差异算法都倾向于逐字符比较。这很好用,直到你在同一个索引上有两个不同的单词,并且有相互的字符。

“我是蒂姆”编辑为“我是金”结果为:

我是T

代替

我是蒂姆·金。

任何指针?

4

4 回答 4

0

按空格分割 StringOriginal 和 StringEdited。循环遍历 StringOriginal 的每个单词,将其与 Edited 中的相同单词索引进行比较。每个不相等的单词都应该放在一个临时变量中,并且只有当您从循环中再次获得相等的单词时才将其连接到结果中。使用 StringBuilder 创建结果。希望这可以帮助

于 2017-10-24T12:28:21.327 回答
0

有点旧时尚,但你可以试试这个。

    string StringOriginal = "I am Tim and I am 27 years old";
    string StringEdited = "I am Kim and I am not that old";

    string[] StringOriginalArray = StringOriginal.Split();
    string[] StringEditedArray = StringEdited.Split();
    string[] newStringArray = new string[StringOriginalArray.Length + StringEditedArray.Length];

    int i = 0;
    int io = 0;
    int ie = 0;

    while (i < newStringArray.Length)
    {
        if (io < StringOriginalArray.Length)
        {
            newStringArray[i] = StringOriginalArray[io];
            io++;
            i++;
        }
        if (ie < StringEditedArray.Length)
        {
            newStringArray[i] = StringEditedArray[ie];
            ie++;
            i++;
        }
    }

    string[] finalArray = new string[newStringArray.Length];
    int f = 0;
    for (int k = 0; k < newStringArray.Length; k=k+2)
    {
        finalArray[f++] = newStringArray[k];
        if (newStringArray[k] != newStringArray[k+1])
        {
            finalArray[f++] = newStringArray[k+1];
        }
    }

    Console.WriteLine(String.Join(" ", finalArray));

输出:

"I am Tim Kim and I am 27 not years that old"
于 2017-10-24T13:14:53.617 回答
0

用空格分割两个字符串,通过 Union 加入结果数组,然后像这样返回字符串:

string[] arr1 = str1.Split(' ');
string[] arr2 = str1.Split(' ');

var merged = arr1.Union(arr2).ToArray<string>();

var mergedString = string.Join(' ', merged);
于 2017-10-24T12:34:08.210 回答
0

一直在寻找这个问题的答案。一直没能找到好的解决办法。想出了以下内容。但这并不完美。

    public static class DiffEngine
    {
        private static Regex r = new Regex(@"(?<=[\s])", RegexOptions.Compiled);

        public static string Process(ref string TextA, ref string TextB)
        {
            var A = r.Split(TextA);
            var B = r.Split(TextB);
            var max = Math.Max(A.Count(), B.Count());
            var sbDel = new StringBuilder("<del>");
            var sbIns = new StringBuilder("<ins>");
            var sbOutput = new StringBuilder();
            var aCurr = string.Empty;
            var bCurr = string.Empty;
            var aNext = string.Empty;
            var bNext = string.Empty;

            for (int i = 0; i < max; i++)
            {
                aCurr = (i > A.Count() - 1) ? string.Empty : A[i];
                bCurr = (i > B.Count() - 1) ? string.Empty : B[i];
                aNext = (i > A.Count() - 2) ? string.Empty : A[i + 1];
                bNext = (i > B.Count() - 2) ? string.Empty : B[i + 1];

                if (aCurr == bCurr)
                {
                    sbOutput.Append(aCurr);
                }
                else
                {
                    if (aNext != bNext)
                    {
                        sbDel.Append(aCurr);
                        sbIns.Append(bCurr);
                    }
                    else
                    {
                        sbDel.Append(aCurr);
                        sbIns.Append(bCurr);
                        sbOutput
                            .Append(sbDel.ToString())
                            .Append("</del>")
                            .Append(sbIns.ToString())
                            .Append("</ins>");
                        sbDel.Clear().Append("<del>");
                        sbIns.Clear().Append("<ins>");
                    }
                }
            }

            A = null;
            B = null;
            sbDel = null;
            sbIns = null;
            return sbOutput.ToString();

        }
    }
于 2019-02-03T15:15:16.827 回答