有没有办法在C#中搜索字符串中的模式?

类似Sql的东西会非常有用.

推荐答案

正则表达式支持LIKE所允许的一切,甚至更多,但其语法完全不同.然而,由于LIKE的规则非常简单(其中%表示零个或多个字符,_表示一个字符),并且LIKE个参数和正则表达式都是用字符串表示的,因此我们可以创建一个正则表达式,它接受LIKE个参数(例如abc_ef% *usd),并将其转换为等价的正则表达式(例如\Aabc.ef.* \*usd\z):

@"\A" + new Regex(@"\.|\$|\^|\{|\[|\(|\||\)|\*|\+|\?|\\").Replace(toFind, ch => @"\" + ch).Replace('_', '.').Replace("%", ".*") + @"\z"

基于此,我们可以构建一个Like()方法:

public static class MyStringExtensions
{
  public static bool Like(this string toSearch, string toFind)
  {
    return new Regex(@"\A" + new Regex(@"\.|\$|\^|\{|\[|\(|\||\)|\*|\+|\?|\\").Replace(toFind, ch => @"\" + ch).Replace('_', '.').Replace("%", ".*") + @"\z", RegexOptions.Singleline).IsMatch(toSearch);
  }
}

因此:

bool willBeTrue = "abcdefg".Like("abcd_fg");
bool willAlsoBeTrue = "abcdefg".Like("ab%f%");
bool willBeFalse = "abcdefghi".Like("abcd_fg");

Sql相关问答推荐

按postquist中的日期查询json列

retrofit AWS Athena中的JSON

SQL Select 最小优先级

在SQL中返回缺省值,即使查询不返回任何结果

我怎样才能得到列值对应的最大值在另一个?

如何计算给定日期前三个月的值以及月初数据?

Oracle 23c ROUND,数据类型为DATE

按连续相等值分组排序

如何将不同层次的产品组和规格组合到最深一层?

GRAFANA 数据库查询错误:pq:列名称不存在

删除对 JSON 数据的未解析引用的 SQL71502 警告

SQL Server 查询 WHERE LIKE

使用临时表判断记录是否存在 - 如果存在则执行相同的操作

SQL 语句将一列中的值与另一列中的不同值相加,同时按第三列进行分组?

如何从一张表中获取值在至少三行相同的记录

每组使用平均值来填补缺失值的SQL

强制 SQL 始终通过 R 从视图中返回至少一行

计算 PostgreSQL 中的平均会话长度

SQL日期比较用例;月初至今的报告

SQL中所有先前日期的累计总和