正規表現とファイルのフィルタリングに使用されるワイルドカードとの違い


15

*ゼロ個以上の前の文字を示すためgrepに使用*.cしますが、のlsようなコマンドで使用するときにすべてのCファイルを見つけるために使用しますls *.c*これらの2つのケースで、使用がどのように異なるかを誰かに教えてもらえますか?

回答:


30

シェルファイル名のグロビング正規表現は同じ文字の一部を使用し、同様の目的を持っていますが、あなたは正しい、それらは互換性がありません。ファイル名のグロビングは、はるかに強力ではないシステムです。

ファイル名のグロビング:

  • * 「ゼロ個以上の文字」を意味します

  • ? 「任意の1文字」を意味します

しかし、正規表現では、.*「ゼロ以上の文字」を意味するために使用する必要があり、.「任意の1文字」意味します。A ?は、正規表現ではまったく異なるものを意味します。つまり、先行するRE要素のゼロまたは1つのインスタンスです。

[]少なくとも単純なケースでは、これを入力しているシステムでは、角括弧()が両方のシステムで同じように動作するようです。これには、POSIX文字クラス(例[:alpha:])などが含まれます。ただし、コマンドをさまざまなシステムタイプで動作させる必要がある場合は、文字のリスト(例[abeq])や文字の範囲(例:)のような基本的なもの以外のものは使用しないことをお勧めします[a-c]

これらの違いは、2つのシステムが単純な場合にのみ直接交換可能であることを意味します。ファイル名の正規表現一致が必要な場合は、別の方法で行う必要があります。find -regex1つのオプションです。(find -nameちなみに、glob構文を使用するにも注意してください。)



3
さらに、正規表現にはさまざまなフレーバーがあります。すべての正規表現が同じように作成されるわけではありません!また、SQLのような他の多くのパターンマッチングシステムがあり'%'ます'*'
ミスターリスター

4
正規表現の2つの主要なフレーバーは、POSIXとPCRE(Perl Compatible RE)です。後者はそれほど長くなく、いくつかの機能があります。Unixツールとシェルは通常POSIXを使用し、組み込み正規表現(シェルを除く)を含むほとんどのプログラミング言語はPCREを使用します。オンラインで資料を読むときは、違いに注意してください。
goldilocks

11

元のタイトルで表現された質問への回答:

正規表現がファイルのフィルタリングに使用されるものと異なるのはなぜですか?

ファイル名の展開は、ほとんどのオペレーティングシステム(ワイルドカード/ジョーカー文字)にすでに存在していた正規表現よりも前のものであり、後者よりもはるかにシンプルで直感的です。

一方で*.txtカジュアルなユーザーが容易に理解され、類似は.*\.txtもっとない言及に、経験豊富なユーザ/プログラマを対象に何かあります^.*\.txt$...


2
「理由」のもう1つの理由は、速度です。正規表現は遅いです:pastebin.com/3iNCgkE3
manatwork

3
*.txt等しくない.*\.txt、それ.*\.txt$.txt(少なくとも)後に等しい(少なくとも妥当なファイル名のグロビングを前提とする)ことができるためです。おそらく^.*\.txt$、使用法にも多少依存します。あなたのポイントを証明しますか?
CVn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.