在.NET中逐字逐字比较两个字符串

时间:2009-11-23 22:03:28

标签: c# .net string string-comparison word-diff

我需要逐字逐句比较两个字符串。 像diff这样的东西,但是对于单词而言,不是为了行。

就像它在维基百科中完成的一样 http://en.wikipedia.org/w/index.php?title=Horapollo&action=historysubmit&diff=21895647&oldid=21893459

结果我想返回两个单词索引数组,两个字符串不同。

.NET是否有可以执行此操作的库/框架/ standalone_method?

P.S。我想比较几千字节的文本

7 个答案:

答案 0 :(得分:4)

实际上,您可能希望实现我们在DNA sequence alignments中使用的局部对齐/全局对齐算法的变体。这是因为您可能无法对两个字符串进行逐字比较。即:

  

快速的棕色狐狸跳过了   懒狗
  快速的狐狸跳过了   懒狗

换句话说,如果你无法识别整个单词的插入和删除,你的比较算法就会变得非常sc。(r)。看一下 Smith-Waterman 算法和 Needleman-Wunsch 算法,找到一种方法使它们适应您的需求。如果字符串很长,这样的搜索空间会变得非常大,你也可以查看BLAST。 BLAST是一种非常常见的启发式算法,几乎是遗传搜索的标准。

答案 1 :(得分:3)

似乎我找到了所需的解决方案:

DiffPlex是.NET Diffing Library与Silverlight和HTML diff查看器的组合。 http://diffplex.codeplex.com/

但它有一个错误。在那些行“Hello-Kitty”“Hello - Kitty”中,单词“Hello”将被标记为差异。虽然区别在于空格符号。

答案 2 :(得分:2)

使用RegularExpressions。

与示例中一样:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections.Specialized;

namespace WindowsApplication10
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            decimal discrimation = 0.75M;
            string formHeading = "The brown dog jumped over the red lazy river, and then took a little nap! Fun!";
            string userSearch = "The brown dog jumped over the red lazy river, and then took a little ";
            //string userSearch = "brown dog nap fun";
            decimal res = CompareText(formHeading, userSearch);

            if (res >= discrimation)
            {
                MessageBox.Show("MATCH!" + res.ToString());
            }
            else 
            {
                MessageBox.Show("does not match! " + res.ToString());
            }
        }


        /// <summary>
        /// Returns a percentage of 1 on how many words were matched
        /// </summary>
        /// <returns></returns>
        private decimal CompareText(string formHeading, string userSearch)
        {
            StringCollection formHeadingWords = new StringCollection();
            StringCollection userSearchWords = new StringCollection();
            formHeadingWords.AddRange(System.Text.RegularExpressions.Regex.Split(formHeading, @"\W"));
            userSearchWords.AddRange(System.Text.RegularExpressions.Regex.Split(userSearch, @"\W"));

            int wordsFound = 0;
            for (int i1 = 0; i1 < userSearchWords.Count; i1++)
            {
                if (formHeadingWords.Contains(userSearchWords[i1]))
                    wordsFound += 1;
            }
            return (Convert.ToDecimal(wordsFound) / Convert.ToDecimal(formHeadingWords.Count));
        }
    }
}

答案 3 :(得分:1)

你可以用唯一的数字替换2个文本中的所有单词,为编辑距离计算取一​​些现成的代码,并将它的字符替换为字符比较,数字与数字比较,你就完成了!

我不确定是否存在任何您想要的库。但是你肯定会找到很多编辑距离的代码。

此外,根据您是否想要在编辑距离计算中实际允许替换,您可以更改动态编程代码中的条件。

看到这个。 http://en.wikipedia.org/wiki/Levenshtein_distance

答案 4 :(得分:1)

你可以试试这个,虽然我不确定你正在寻找的是StringUtils.difference()(http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#difference%28java.lang.String,%20java.lang.String%29

或者,Eclipse(eclipse.org)项目具有差异比较功能,这意味着它们还必须具有用于确定差异的代码,您可以浏览其API或源以查看可以找到的内容。

祝你好运。

答案 5 :(得分:0)

答案 6 :(得分:0)

c#的另一个库是diff-match-patch - http://code.google.com/p/google-diff-match-patch/

它在字符中找到了不同之处。好的,有指令你必须添加什么来区分单词。