2009-06-05 4 views

ответ

0

Я не знаю метода, встроенный в .NET, однако это тривиальное дублировать с Regex:

public static bool PathMatchSpec(String path, String spec) 
{ 
    String specAsRegex = Regex.Escape(spec).Replace("\\*", ".*").Replace("\\?", ".") + "$"; 
    return Regex.IsMatch(path, specAsRegex); 
} 

Очевидно, это предполагает, что упоминается пространство имен System.Text.RegularExpressions. Если вы собираетесь делать это с такой же спецификацией, вы также можете кэшировать Regex.

EDIT TO ADD: P/Invoke - это действительно опция, но подпись для PathMatchSpec указывает, что для нее требуется строка ANSI, поэтому для каждого вызова вы будете выполнять преобразование набора символов. Имейте это в виду, если вы идете по этому маршруту. В таком случае, возможно, предпочтительнее PathMatchSpecEx.

+0

Прохладный ... сам не знал о методе Escape(); определенно упростит часть моего решения;) – jerryjvl

0

Короче ... не то, что я не знаю ... но, возможно, это может помочь вам в этом (обратите внимание, немного большего времени, чем вы могли бы хотеть, но он служил мне хорошо):

sealed public class WildcardMatch 
{ 
    private static Regex wildcardFinder = new Regex(@"(?<wildcards>\?+|\*+)", RegexOptions.Compiled | RegexOptions.Singleline); 
    private Regex wildcardRegex; 

    public WildcardMatch(string wildcardFormat) : this(wildcardFormat, false) { } 

    public WildcardMatch(string wildcardFormat, bool ignoreCase) 
    { 
     if (wildcardFormat == null) 
      throw new ArgumentNullException("wildcardFormat"); 

     StringBuilder patternBuilder = new StringBuilder("^"); 
     MatchCollection matches = this.wildcardFinder.Matches(wildcardFormat); 
     string[] split = this.wildcardFinder.Split(wildcardFormat); 
     for (int ix = 0; ix < split.Length; ix++) 
     { 
      // Even indexes are literal text, odd indexes correspond to matches 
      if (ix % 2 == 0) 
       patternBuilder.Append(Regex.Escape(split[ix])); 
      else 
      { 
       // Matches must be substituted with Regex control characters 
       string wildcards = matches[ix/2].Groups["wildcards"].Value; 
       if (wildcards.StartsWith("*", StringComparison.Ordinal)) 
        patternBuilder.Append("(.*)"); 
       else 
        patternBuilder.AppendFormat(CultureInfo.InvariantCulture, "({0})", wildcards.Replace('?', '.')); 
      } 
     } 
     patternBuilder.Append("$"); 

     this.wildcardRegex = new Regex(
      patternBuilder.ToString(), 
      RegexOptions.Singleline | (ignoreCase ? RegexOptions.IgnoreCase : RegexOptions.None)); 
    } 

    public bool IsMatch(string value) 
    { 
     if (value == null) 
      return false; 

     return this.wildcardRegex.IsMatch(value); 
    } 

    public IEnumerable<string> ExtractMatches(string value) 
    { 
     if (value == null) 
      yield break; 

     Match match = this.wildcardRegex.Match(value); 
     if (!match.Success) 
      yield break; 

     for (int ix = 1; ix < match.Groups.Count; ix++) 
      yield return match.Groups[ix].Value; 
    } 
} 
+0

Обратите внимание, что при использовании anelsons 'Regex.Escape()' код экранирования может быть упрощен. – jerryjvl

Смежные вопросы