正規表現VSファイル名のグロビング


15

正規表現は文字と文字列でのみ使用されることを知っていますが、ファイル名でそれらを見つけることがあります。私の質問は、正規表現は文字またはファイル名のみで使用されますか?

回答:


19

正規表現とファイル名のグロビングは、2つの非常に異なるものです。

正規表現は、テキストのパターンマッチングのコマンド/関数で使用されます。たとえば、のパターンパラメータgrep、またはプログラミング言語で。

ファイル名のグロビングは、ワイルドカードを使用してファイル名とディレクトリ名を一致させるためにシェルによって使用されます。グロビングの機能はシェルに依存します。たとえば、Bashは次のようなワイルドカードをサポートしています。

  • * 0個以上の文字に一致
  • ? 1文字に一致
  • [...] 指定されたセットの文字に一致します

これらのワイルドカードは正規表現に似ているように見えますが、実際に[...]はグロビングと正規表現で同じ意味を持っています。しかし、グロビングと正規表現では異なること*?意味します。

あなたが書いたコメントで:

しかし、インタープリターはどのように違いますか*ジョーカーか正規表現か?例えば:grep a*b a*.txt

簡単です。並べ替え。

まず、シェルはファイル名と一致するワイルドカードを解釈しようとします。「a」で始まり「b」で終わるファイルがある場合、シェルはa*b一致するファイル名に置き換えます。同じことが当てはまりますa*.txt。一致するファイル名がない場合、シェルはgrep文字通り引数を渡します。

ただし、の最初のパラメーターはgrepパターンでなければなりません。実際の使用例の99.999%では、最初のパラメーターがシェルによって解釈されることは望ましくありません。だからおそらく最も意図はこれでした:

grep "a*b" a*.txt

引用のおかげa*bで、シェルはグロビングを使用して解釈せず、代わりに直接渡しgrepます。次に、grepそれを正規表現として(設計により)解釈します。

要約すると、シェルは、ワイルドカードを使用している独自のグロビング言語に従ってコマンドラインを解釈します。コマンド、プログラムは、作成者が設計した方法でパラメーターを解釈します。


4

ファイル名が文字列の場合、ファイル名にも正規表現を使用できます。たとえば、正規表現に一致するファイル名を検索する場合は、次を試してください。

find ./ -regex '.*[abc][xyz].*'

このコマンドは、名前にa、bまたはcがあり、その後にx、yまたはzが続くファイルを探します。これはほんの一例です。無限の可能性があります。


しかし、インタープリターはどのように違いますか*ジョーカーか正規表現か?例:$ grep a "asterix" b a "asterix" .txt
Hamza

2
使用するfind ./ -name 'a*'場合は、ワイルドカードとして* を使用します。を入力するときfind ./ -regex 'a*'、正規表現で*を使用します。重要な違いはスイッチ-nameまたは-regexです。
誰も
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.