System.StringComparer, поддерживающий подстановочный знак (*)

Я ищу быстрый .NET-class / библиотеку, у которой есть StringComparer, поддерживающий подстановочный знак (*) и чувствительность к положению. Есть идеи?

    Вы можете использовать Regex с RegexOptions.IgnoreCase, а затем сравнить с методом IsMatch.

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

    Это будет соответствовать prefix*suffix . Вы также можете рассмотреть возможность использования StartsWith или EndsWith как альтернативы.

    В качестве альтернативы вы можете использовать эти расширенные функции:

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