【问题标题】:String comparison with Wildcard search in c#字符串比较与 C# 中的通配符搜索
【发布时间】:2017-02-09 07:23:07
【问题描述】:

我有两个字符串供比较

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 比较方法,但我的要求是,如果我们比较 str2str3 ,它应该返回 True ,因为它位于 Str2

我们可以在 C# 中实现这样的行为吗?我已经在 SQL 中做到了这一点,但在 C# 中没有得到一些有用的东西。任何 regex 等?

【问题讨论】:

  • 是的,您可以在 .NET 中使用正则表达式 - 您尝试过吗?如果是这样,请展示您尝试过的内容...
  • Str2 = "A B C D"Str1 = "A C"; 的预期结果是什么
  • @JonSkeet 我尝试了 Contains 方法,该方法已经共享。但是在使用 % 符号后,它会将其视为字符串的一部分,而不是通配符。
  • 是的,Contains 不使用正则表达式——我不知道你为什么会这么认为。您是否研究过在 .NET 中使用正则表达式? (Stack Overflow 应该是在做了所有可以做的研究之后的最后手段,而不是在你尝试的第一件事不起作用之后的第一个停靠港。)

标签: c# regex wildcard


【解决方案1】:

我建议将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"); 
} 

【讨论】:

  • 注意:如果字符串太长,并且模式中包含大量% 通配符,.* 模式可能会减慢代码执行速度。也许最好的方法是使用Tim's LikeOperator.LikeString approach(虽然没有测试)。
  • 由于您创建了扩展方法,因此您必须省略“ContainsLike”括号中的第一个参数“source”(在您的上一个示例代码中)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多