【问题标题】:System.StringComparer that supports wildcard (*)System.StringComparer 支持通配符 (*)
【发布时间】:2011-01-26 21:36:38
【问题描述】:

我正在寻找一个快速的 .NET 类/库,它具有支持通配符 (*) 和大小写敏感性的 StringComparer。 有什么想法吗?

【问题讨论】:

    标签: c# .net stringcomparer


    【解决方案1】:

    您可以将 Regex 与 RegexOptions.IgnoreCase 一起使用,然后与 IsMatch 方法进行比较。

    var wordRegex = new Regex( "^" + prefix + ".*" + suffix + "$", RegexOptions.IgnoreCase );
    
    if (wordRegex.IsMatch( testWord ))
    {
        ...
    }
    

    这将匹配prefix*suffix。您也可以考虑使用 StartsWith 或 EndsWith 作为替代方案。

    【讨论】:

      【解决方案2】:

      您也可以使用这些扩展功能:

      public static bool CompareWildcards(this string WildString, string Mask, bool IgnoreCase)
      {
          int i = 0;
      
          if (String.IsNullOrEmpty(Mask))
              return false;
          if (Mask == "*")
              return true;
      
          while (i != Mask.Length)
          {
              if (CompareWildcard(WildString, Mask.Substring(i), IgnoreCase))
                  return true;
      
              while (i != Mask.Length && Mask[i] != ';')
                  i += 1;
      
              if (i != Mask.Length && Mask[i] == ';')
              {
                  i += 1;
      
                  while (i != Mask.Length && Mask[i] == ' ')
                      i += 1;
              }
          }
      
          return false;
      }
      
      public static bool CompareWildcard(this string WildString, string Mask, bool IgnoreCase)
      {
          int i = 0, k = 0;
      
          while (k != WildString.Length)
          {
              if (i > Mask.Length - 1)
                  return false;
      
              switch (Mask[i])
              {
                  case '*':
      
                      if ((i + 1) == Mask.Length)
                          return true;
      
                      while (k != WildString.Length)
                      {
                          if (CompareWildcard(WildString.Substring(k + 1), Mask.Substring(i + 1), IgnoreCase))
                              return true;
      
                          k += 1;
                      }
      
                      return false;
      
                  case '?':
      
                      break;
      
                  default:
      
                      if (IgnoreCase == false && WildString[k] != Mask[i])
                          return false;
                      if (IgnoreCase && Char.ToLower(WildString[k]) != Char.ToLower(Mask[i]))
                          return false;
      
                      break;
              }
      
              i += 1;
              k += 1;
          }
      
          if (k == WildString.Length)
          {
              if (i == Mask.Length || Mask[i] == ';' || Mask[i] == '*')
                  return true;
          }
      
          return false;
      }
      

      CompareWildcards 将字符串与多个通配符模式进行比较,CompareWildcard 将字符串与单个通配符模式进行比较。

      示例用法:

      if (Path.CompareWildcards("*txt;*.zip;", true) == true)
      {
          // Path matches wildcard
      }
      

      【讨论】:

        【解决方案3】:

        您也可以尝试关注

        class Wildcard : Regex
            {
                public Wildcard() { }
                public Wildcard(string pattern) : base(WildcardToRegex(pattern)) { }
                public Wildcard(string pattern, RegexOptions options) : base(WildcardToRegex(pattern), options) { }
                public static string WildcardToRegex(string pattern)
                {
                    return "^" + Regex.Escape(pattern).
                    Replace("\\*", ".*").
                    Replace("\\?", ".") + "$";
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2023-03-06
          • 2014-09-23
          • 2021-10-22
          • 2020-10-16
          • 1970-01-01
          • 2021-12-14
          • 2018-04-21
          • 2015-06-08
          • 2020-07-14
          相关资源
          最近更新 更多