ワイルドカード文字列一致 API (正規表現一致ではない) を探しています。Win32 API 以外は使用できません。
6 に答える
PathMatchSpecがありますが、処理はファイルに特化しているため、一般的なワイルドカード マッチングが必要な場合は、期待どおりの結果が得られない可能性があります。
それ以外の場合は、Pavel が詳述したように、おそらく RegEx を使用する必要があります。
[編集] FindFirstFile/FindNextFileのプロパティを共有する
と誤って仮定しました。いくつかのテストを実行しましたが、そうではありません。というわけで最有力候補のようです。PathMatchSpec
何年も経ち、誰もあなたにこの答えを与えなかったのは奇妙です:
探していることを正確に実行する WIN32 API があります。(MSDNで「ワイルドカード」を検索しているのを見つけました)
その名はSymMatchString()
。これは、オペレーティング システムの一部である DbgHelp.dll にあります。
アプリがマルチスレッド化されている場合は、API 呼び出しの周りに CriticalSection を配置してください。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms681355%28v=vs.85%29.aspx
ワイルドカードの一致に内部的に使用するAPIFindFirstFile()
は、おそらくFsRtlIsNameInExpression()
.
エルム
最も簡単な方法は、次のルールに従って、glob パターンを正規表現に変換することです。
*
になる.*
?
になる.
- のいずれかを
\|.^$+()[]{}
前に付けることでエスケープされます。\
これは部分的に真実です。
次のルールは、XP+ コマンド プロンプトでの DIR の動作から導き出されます:
*
と同じで*.*
あり、正規表現.+
?
になるワイルドカードが続か.?
ない限り正規表現になる
?
.
*.
[^.]+$
およびAPI はワイルドカード マッチをFindFirstFile
行いFindNextFile
ますが、ファイル名に対してのみです。
Win32しか使えないの?STLまたはCRTはどうですか?ブーストを使用していますか?
Win32 API の制限がない場合は、オープン ソース プロジェクトのコードを使用することをお勧めします。別のオプションは、グロブを正規表現に変換することです。これは、正規表現の置換操作で実行できると思います。
編集: 最初の Google マッチは PHP コードです:
単純なワイルドカード比較 ( globbing ) を求めている場合は、これ(コードで使用するもの)を含む独自のものを作成した人もいます。
あなたの要件は何ですか?' ' 記号を使用して0 個以上の文字に一致させようとしているだけですか、それとも '?' を使用する予定ですか? シンボルも。' ' だけの場合、a、 a、a b、a b*c などの型パターンを探す必要がありますか? 要件が限られている場合は、C++ ランタイム ライブラリの strstr 関数で簡単に解決できます。