5

私は正規表現が初めてです。最近、ワイルドカード パターンを正規表現に変換するタスクを提示されました。これは、ファイル パスが正規表現と一致するかどうかを確認するために使用されます。

たとえば、私のパターンが *.jpg;*.png;*.bmp

セミコロンで分割し、文字列をエスケープし、エスケープされたものを次のように置き換えることで、正規表現を生成できまし*.*

String regex = "((?i)" + Regex.Escape(extension).Replace("\\*", ".*") + "$)";

したがって、結果の正規表現は jpg ((?i).*\.jpg)$) Thien 用になります。OR 演算子を使用してすべての拡張子を結合します。

したがって、この例の最終的な表現は次のようになります。

((?i).*\.jpg)$)|((?i).*\.png)$)|((?i).*\.bmp)$)

私はそれをテストしましたが、うまくいきましたが、他のケースをカバーするために式を追加または削除する必要があるのか​​ 、それとも全体としてより良い形式があるのか​​ わかりません

*myfile.jpgまた、名前が myfile.jpg で終わるすべてのファイルに一致する必要がある場所のようなワイルドカードに遭遇する可能性があることにも注意してください。

のようなパターンに遭遇することがあります*myfile.jpg;*.png;*.bmp

4

1 に答える 1

8

そこには多くのグループ化が行われていますが、これは実際には必要ありません...まあ、あなたが言及していないことがない限り、この正規表現はより少ない費用で同じことをします:

 /.*\.(jpg|png|bmp)$/i

これは正規表現表記であり、C# では次のようになります。

String regex=new RegEx(@".*\.(jpg|png|bmp)$",RegexOptions.IgnoreCase);

プログラムで 2 つの間を変換する必要がある場合は、正しい軌道から始めました - セミコロンで分割し、拡張機能をセットにグループ化します (前のドットなし)。ワイルドカード パターンがより複雑になる可能性がある場合 (ワイルドカードを使用した拡張、複数のワイルドカードの開始一致)、もう少し作業が必要になる可能性があります;)

編集:(更新用)

ワイルド カードがより複雑になる可能性がある場合は、ほぼ完了です。上記のコードには、(拡張のために) ドットを引き出す最適化があり、ドットを元に戻す必要があるため、次のようになります。

 /.*(myfile\.jpg|\.png|\.bmp)$/i

基本的に '*' -> '.*', '.' -> '\.' (エスケープされます)、残りはセットに入ります。myfile.jpg基本的には、.pngまたはで終わるもの(ドル記号は最後に固定されます)に一致すると言い.bmpます。

于 2012-10-02T19:15:56.140 に答える