C#实现字符串模糊匹配的方法小结

 更新时间:2024年07月02日 10:01:52   作者:我写代码菜如坤  
在C#中实现字符串的模糊匹配可以借助正则表达式或者一些模糊匹配算法来实现,文章通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

在C#中实现字符串的模糊匹配可以借助正则表达式或者一些模糊匹配算法来实现。

方法一:使用正则表达式

如果你的模糊匹配是基于简单的通配符(如*?),可以通过正则表达式来实现。

using System;
using System.Text.RegularExpressions;
 
class Program
{
    static void Main()
    {
        string pattern = "he*o"; // 例如,模糊匹配模式
        string input = "hello"; // 要匹配的字符串
 
        // 将模糊匹配模式转换为正则表达式
        string regexPattern = "^" + Regex.Escape(pattern)
                                    .Replace("\\*", ".*")
                                    .Replace("\\?", ".") + "$";
 
        // 使用正则表达式进行匹配
        if (Regex.IsMatch(input, regexPattern))
        {
            Console.WriteLine("字符串匹配成功!");
        }
        else
        {
            Console.WriteLine("字符串匹配失败!");
        }
    }
}

方法二:使用模糊匹配算法

如果你需要更复杂的模糊匹配(例如模糊搜索、近似匹配等),可以使用字符串相似度算法,如Levenshtein距离或者Jaccard相似度等。这些算法可以衡量两个字符串之间的相似程度,然后根据阈值判断是否匹配。

以下是一个使用Levenshtein距离算法进行模糊匹配的示例:

using System;
 
class Program
{
    static void Main()
    {
        string pattern = "hello"; // 模糊匹配模式
        string input = "heLlo"; // 要匹配的字符串
 
        int threshold = 2; // 可接受的最大编辑距离
 
        // 计算输入字符串与模式字符串的编辑距离
        int distance = ComputeLevenshteinDistance(input.ToLower(), pattern.ToLower());
 
        // 如果编辑距离在阈值范围内,则认为匹配成功
        if (distance <= threshold)
        {
            Console.WriteLine("字符串匹配成功!");
        }
        else
        {
            Console.WriteLine("字符串匹配失败!");
        }
    }
 
    // 计算Levenshtein距离的方法
    static int ComputeLevenshteinDistance(string s, string t)
    {
        int n = s.Length;
        int m = t.Length;
        int[,] d = new int[n + 1, m + 1];
 
        // 初始化边界条件
        for (int i = 0; i <= n; i++)
        {
            d[i, 0] = i;
        }
        for (int j = 0; j <= m; j++)
        {
            d[0, j] = j;
        }
 
        // 计算编辑距离
        for (int j = 1; j <= m; j++)
        {
            for (int i = 1; i <= n; i++)
            {
                if (s[i - 1] == t[j - 1])
                {
                    d[i, j] = d[i - 1, j - 1];
                }
                else
                {
                    d[i, j] = Math.Min(d[i - 1, j] + 1, // 删除
                                      Math.Min(d[i, j - 1] + 1, // 插入
                                               d[i - 1, j - 1] + 1)); // 替换
                }
            }
        }
 
        return d[n, m];
    }
}

以上代码示例中,ComputeLevenshteinDistance方法计算了两个字符串之间的Levenshtein距离,然后通过比较距离与设定的阈值来判断是否匹配。

根据你的具体需求,选择适合的方法来实现字符串的模糊匹配。

拓展:C#  list 中字段的模糊查找匹配实现

在游戏中,关于在列表中 查找某行数据时,需要通过关键字匹配,去遍历表中的数据,如果表中匹配到关键字,则返回该行数据,没有则返回null。比如查找在好友列表查找某个好友时。

建立一个 data 数据:用于保存item 的所有信息 (如: id,title,content,icon 等)

public class Data{

  public int id;
  public string name;
  public string title;
  public string content;
  public string icon;
  ...
}

实现:

private List<Data> onFindKeyWord(string str, List<Data> list){

List<Data> m_list= new List<Data>();
int count = list.Count;
 for(int i=0; i<count; i++){
  Data data = list[i];
  if(data.name.Indexof(str) != -1)
  {
    m_list.Add(data);
  }

 }
 return m_list; // 返回新的列表,符合模糊查询的结果列表
}

用foreach 遍历, 通过name模糊查找

private List<Data> onFindKeyWord(string str, List<Data> list){

List<Data> m_list= new List<Data>();
foreach(Data data in list)
{
  if(data.name.Indexof(str) != -1){
    m_list.Add(data);
  }

}
return m_list;

}

使用 list.Find(); 通过name 精确查找,不存在返回null

private List<Data> onFindKeyWord(string str, List<Data> list){

List<Data> m_list= new List<Data>();
Data data = list.Find(m_data=> m_data == str);
// 需要判断是否存在
if(data != null){
  m_list.Add(data);
}
return m_list;
}

到此这篇关于C#实现字符串模糊匹配的方法小结的文章就介绍到这了,更多相关C#字符串模糊匹配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于c# Task自己动手写个异步IO函数

    基于c# Task自己动手写个异步IO函数

    这篇文章主要介绍了如何基于c# Task自己动手写个异步IO函数,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • c# 重载WndProc,实现重写“最小化”的实现方法

    c# 重载WndProc,实现重写“最小化”的实现方法

    在做“亦歌桌面版”的时候,发现当打开歌词状态下,用最小化隐藏窗体到托盘的话(如下code #1),在调出发现歌词缩小了(虽然显现的窗体大小跟刚才一样),从这点看调用该方法其实窗体大小是改变了的(这个过程只是不可视而已)。
    2009-02-02
  • C# 多态性的深入理解

    C# 多态性的深入理解

    本篇文章是对C#中的多态性进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • unity实现简单抽奖系统

    unity实现简单抽奖系统

    这篇文章主要为大家详细介绍了unity实现简单抽奖系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • C#使用stackalloc分配堆栈内存和非托管类型详解

    C#使用stackalloc分配堆栈内存和非托管类型详解

    这篇文章主要为大家介绍了C#使用stackalloc分配堆栈内存和非托管类型详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2022-12-12
  • 详解C#中使用对象或集合的初始值设定项初始化的操作

    详解C#中使用对象或集合的初始值设定项初始化的操作

    这篇文章主要介绍了详解C#中使用对象或集合的初始值设定项初始化的操作,文中分别讲了对对象和字典的初始化,需要的朋友可以参考下
    2016-01-01
  • LINQ投影操作符Select与限制操作符where介绍

    LINQ投影操作符Select与限制操作符where介绍

    这篇文章介绍了LINQ投影操作符Select与限制操作符where,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • C#计算字符串相似性的方法

    C#计算字符串相似性的方法

    这篇文章主要介绍了C#计算字符串相似性的方法,实例分析了C#计算字符串相似性的原理与算法实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#简单连接sql数据库的方法

    C#简单连接sql数据库的方法

    这篇文章主要介绍了C#简单连接sql数据库的方法,涉及C#基于控制台的数据库连接创建于命令执行相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • C#实现简易画图板的示例代码

    C#实现简易画图板的示例代码

    这篇文章主要介绍了C#实现简易画图板的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论