2009-06-05 13 views

答えて

0

は、しかし、それは正規表現で複製する些細です:

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

明らかにこれはSystem.Text.RegularExpressions名前空間が参照されている前提としています。あなたが同じ仕様でこれをやろうとすれば、Regexもキャッシュすることができます。

編集に追加: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

関連する問題