.NET Frameworkでワイルドカードを手っ取り早く実装する

 C#やVB.netにおいてプログラムで独自のテキスト検索などで、「*」や「?」を使ったいわゆる「ワイルドカード」を用いたいと考えても、.NET Frameworkではファイル検索のためにしか用意されていません。しかし、これから紹介する方法を使えば、.NET Frameworkで簡単にワイルドカード検索を実装することができるようになります。

 それはワイルドカードの定義文字を正規表現に置き換えてしまうこと。ワイルドカードの「*」は正規表現の「.*?」に、「?」は「.」にそれぞれあてはまるので、String.Replaceでこれらに置換するだけです。ただし、元の文字列に正規表現のための記号が含まれると誤認識されるので、あらかじめRegex.Escapeで、正規表現記号を無効にしておくようにしましょう。
wildcard.cs
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

namespace WildCard
{
    class Program
    {
        static void Main(string[] args)
        {
            // 行いたいワイルドカード定義
            string wildptn = "*.txt";

            // 同じ結果を得られる正規表現に変換
            string regptn = Regex.Escape(wildptn);
            regptn = regptn.Replace(@"\*", ".*?");
            regptn = regptn.Replace(@"\?", ".");

            Regex regex = new Regex(regptn);
            foreach(string s in Directory.GetFiles("D:\\")){
                // Dドライブ直下のファイルから「*.txt」
                // に一致するファイル名を抜き出す
                if(regex.IsMatch(s)) Console.WriteLine(s);
            }
        }
    }
}
2008/09/08