如何在C#中比较两个字符串并提取差异单词?
在C#中提取两个字符串的差异单词(忽略大小写、标点,基于存在性而非数量)
完全可以实现,核心思路是先把两个字符串处理成去重、统一大小写的单词集合,再通过集合操作找出仅在其中一个字符串中存在的单词。以下是具体实现方案:
步骤说明
字符串预处理:
- 用正则匹配提取单词(保留单词内的撇号,比如
meet's),自动忽略逗号等无关标点 - 将所有单词转为小写,消除大小写差异
- 转为
HashSet<string>自动去重——只要单词在字符串中出现过至少一次,就视为"存在",不考虑出现次数
- 用正则匹配提取单词(保留单词内的撇号,比如
计算差异单词:
- 利用集合的
Except方法分别找出仅在第一个字符串、仅在第二个字符串中存在的单词 - 合并两组结果,得到所有差异单词
- 利用集合的
代码实现
using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; public class StringDifferenceFinder { // 提取并预处理字符串中的单词,返回去重、小写的单词集合 private static HashSet<string> GetUniqueWords(string input) { // 匹配包含字母、数字和撇号的单词,自动排除逗号等标点 var matches = Regex.Matches(input.ToLower(), @"\b[\w']+\b"); return new HashSet<string>(matches.Cast<Match>().Select(m => m.Value)); } // 获取两个字符串的差异单词,返回List<string> public static List<string> GetDifferenceWords(string str1, string str2) { var words1 = GetUniqueWords(str1); var words2 = GetUniqueWords(str2); // 合并仅在str1存在和仅在str2存在的单词 var onlyInStr1 = words1.Except(words2); var onlyInStr2 = words2.Except(words1); return onlyInStr1.Concat(onlyInStr2).ToList(); } // 获取差异单词的空格分隔字符串 public static string GetDifferenceString(string str1, string str2) { var differenceWords = GetDifferenceWords(str1, str2); return string.Join(" ", differenceWords); } // 测试示例 public static void Main() { string str1 = "Cat meet's a dog"; string str2 = "Cat meet's a dog and a bird"; var differenceList = GetDifferenceWords(str1, str2); Console.WriteLine("差异单词列表:"); foreach (var word in differenceList) { Console.WriteLine(word); } var differenceStr = GetDifferenceString(str1, str2); Console.WriteLine("\n差异单词字符串:" + differenceStr); // 输出结果:and bird } }
关键细节说明
- 正则表达式
\b[\w']+\b确保正确匹配meet's这类包含撇号的单词,同时自动过滤逗号、句号等标点 HashSet的去重特性完美满足"只要双方都存在该单词(不管数量)就不算差异"的需求Except方法是高效的集合差集计算方式,性能优于手动遍历比对
内容的提问来源于stack exchange,提问作者codeninja
相关产品推荐
相关产品推荐

