支持通配符的System.StringComparer(*)

我正在寻找一个快速的.NET类/库,它具有支持通配符(*)AND incase-sensitivity的StringComparer。 有任何想法吗?

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

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

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

或者,您可以使用这些扩展function:

 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 } 

或者你可以尝试以下

 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("\\?", ".") + "$"; } }