2012-01-12 11 views
4

Windowsのフレーバー付き*?のワイルドカードを文字列に一致させる簡単で強力な方法を探しています。シンプルでパワフルなウィンドウワイルドカード( `*、?`)一致の実装を探しています

,ワイルドカードの表現を正規表現に変換すると複雑になりますが、パフォーマンスについてはわかりません。

幸せな媒体が求められました。

編集:私は.gitignoreファイルを解析し、Gitと同じファイルに一致させようとしています。これが意味:

  • ファイルが.gitignoreのパターンの
  • 数に大きくなる可能性が(私は、ファイルのインデックスに格納されている1つに対してパスをチェックしています)、リポジトリの指標のうち、である必要があります。
  • 確認するファイルの数も大きくなる可能性があります。
+3

非常に曖昧です。いくつかの入力を希望する出力で掲示する。 –

+1

@Henk、ほとんどのWindowsの人々はwhatsの意味を知っているだろう、*任意の文字数、? 1つの不明な文字だけです...?blah * .txtは、blahの前の文字と一致します。blahの後の任意の数の文字と.txtで終わります。 –

+0

@HenkHolterman、 '.gitignore'ファイルを解析しています。私はオリジナルのGitオファーと同じ動作を達成する必要があります。 – shytikov

答えて

4

のWindowsの同等物は、正規表現で?*をワイルドカードだけ..*です。


新しい編集(あなたが実際のファイルを探していることを示す)を考えると、[編集]、私は完全に翻訳をスキップして、.NETがDirectory.GetFiles()を使用して検索をやらせるだろう。あなたが正規表現ベースのアプローチで行くべき

(Windowsの場合、それは常に1つの文字と一致し、一方、「ゼロまたは1つの文字」?Directory.GetFiles()にマッチを渡し、何らかの理由で、それを注意してください)

+0

Personality、私はregex'esに翻訳する考えが嫌いです。多くのことを翻訳する必要があるからです。たとえば、点、括弧などは、それらをエスケープする必要があります。ユーザーがワイルドカードを入力する際の正確性を保証するものではありません。これは複雑なアプローチに変わります。 – shytikov

+4

独自のパターンマッチングを書くことは、正規表現に変換するよりも確かに複雑です。 – CodesInChaos

+1

@Alexey:[Regex.Escape()](http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.escape.aspx) –

1

変換*と?正規表現は非常に簡単です。
? "?" "。{1}"を と置き換え、 "*"を "。+?"に置き換えます。

これは、Windowsでのワイルドカードマッチングと同じ動作になります。

EDIT: boolean PathMatchSpec(input, pattern)となります。

Private Declare Auto Function PathMatchSpec Lib "shlwapi" (ByVal pszFileParam As String, ByVal pszSpec As String) As Boolean 
+0

はい、簡単ですが、ある種類のパターンを別の種類に変換しない他の方法はありますか? – shytikov

+3

正規表現で特別な意味を持つ文字をエスケープする必要もあります。 – CodesInChaos

+0

良い点@CodeInChaos –

1

あなたのデータ量が膨大でないか、または正規表現がパフォーマンスに重大な影響を与えると言うデータポイントがない限り。

この場合、他の解決策もパフォーマンスに影響を与える可能性があり、おそらく何かをハンドリングする必要があります。

2

あなたは、いくつかの一時ファイルが最初にあなたのtargetstringsを形成作成する必要があり

System.IO.Directory.GetFiles(myPath, myPattern) 

を使用し、すべてのコーナー場合を含む完全一致を得るために。

言い換えれば、私は、あなたがファイルシステムを満たす時間が来るまでパターンを乾燥させておくべきだと思います。

+0

私は、フォルダ内のすべてのファイルを取得しているので、私の場合はほとんど役に立たないですGitのインデックスからどれだけ多くのものがあるかを調べるよりも、指摘していました。そして、ファイルの中には、 '.gitignore'のパターンのセットと一致しないこれらのものを探していました。 – shytikov

関連する問題