c#中通配符搜索的字符串比较

时间:2017-02-09 07:23:08

标签: c# regex wildcard

我有两个用于比较的字符串

String Str1 = "A C";
String Str2 = "A B C";
Str2.Contains(Str1); //It will return False ,Contains append % at Start and End of string 

//Replace space with %
Str1 = "%A%C%"; 
Str2 = "%A%B%C%";
Str2.Contains(Str1); //Want it to return True ,

我们有Contains,StartsWith,EndsWith方法进行比较,但我的要求是,如果我们比较 str2 str3 ,它应该返回 True < / strong>,因为它位于 Str2

我们能否在C#中实现这样的行为?我已经在SQL中完成了这项工作,但没有在C#中获得一些有用的东西。还有正则表达式等吗?

1 个答案:

答案 0 :(得分:2)

我建议将 SQL-LIKE 转换为正则表达式

private static string LikeToRegular(string value) {
  return "^" + Regex.Escape(value).Replace("_", ".").Replace("%", ".*") + "$";
}

然后像往常一样使用Regex

string like = "%A%C%";
string source = "A B C";

if (Regex.IsMatch(source, LikeToRegular(like))) {
  Console.Write("Matched");
}

如果需要,您甚至可以实现扩展方法

public class StringExtensions {
  public static bool ContainsLike(this string source, string like) {
    if (string.IsNullOrEmpty(source))
      return false; // or throw exception if source == null
    else if (string.IsNullOrEmpty(like))
      return false; // or throw exception if like == null 

    return Regex.IsMatch(
      source,
      "^" + Regex.Escape(like).Replace("_", ".").Replace("%", ".*") + "$");
  }
}

所以你可以把

string like = "%A%C%";
string source = "A B C";

if (source.ContainsLike(source, like)) {
  Console.Write("Matched"); 
}