基本的な正規表現を使用して検索を改善し、時間を節約する方法
Grepで検索していても、ファイル名を一括変更できるプログラムを探していても、仕事を終わらせるためのより簡単な方法があるかどうか疑問に思っています。ありがたいことに、あり、それは「正規表現」と呼ばれています。
(XKCD.comからのコミック)
正規表現とは?
正規表現は非常に特殊な方法でフォーマットされたステートメントであり、それはさまざまな結果を意味します。 “ regex”または“ regexp”とも呼ばれ、主に検索機能とファイル命名機能で使用されます。 1つの正規表現を式のように使用して、さまざまな出力を作成し、それらすべてを検索することができます。あるいは、正規表現を指定してファイルのグループの命名方法を指定し、ソフトウェアが次の意図した出力に徐々に移動することもできます。これにより、複数のフォルダにある複数のファイルの名前を非常に簡単かつ効率的に変更でき、単純な番号付けシステムの制限を超えて移動できます。.
正規表現の使用は特別な構文に依存しているので、あなたのプログラムはそれらを読みそして構文解析することができなければなりません。 WindowsおよびOS X用の多くのバッチファイル名変更プログラムは、正規表現、およびクロスプラットフォーム検索ツールGREP(Bashスクリプト入門ガイドで触れました)およびAwkコマンドラインツール* Nixをサポートしています。さらに、他の多くのファイルマネージャ、ランチャー、および検索ツールがそれらを使用し、それらはPerlやRubyのようなプログラミング言語において非常に重要な場所を持っています。 .NET、Java、Pythonなどの他の開発環境、および次期C ++ 11では、すべて正規表現を使用するための標準ライブラリが提供されています。あなたが想像できるように、それらはあなたがプログラムに入れるコードの量を最小にすることを試みるとき本当に役に立ちます。.
エスケープ文字についての注意
例を挙げて説明する前に、いくつか指摘しておきます。正規表現の適用方法を示すために、bashシェルとgrepコマンドを使用します。問題は、grepに渡す必要がある特殊文字を使いたいことがあり、bashシェルもその文字を解釈するためです。このような状況では、これらの文字を「エスケープ」する必要があります。この文字の「エスケープ」は正規表現内でも発生するため、これは混乱を招く可能性があります。たとえば、これをgrepに入力したい場合は、
\<
これを次のように置き換える必要があります。
\\\<
ここでの各特殊文字は1つのバックスラッシュを取得します。あるいは、一重引用符を使用することもできます。
'\<'
一重引用符は、bashにそれらの内部の内容を解釈しないように指示します。私達があなたのために実演することができるように私達がこれらのステップが取られることを要求する間、あなたのプログラム(特にGUIベースのもの)はしばしばこれらの追加のステップを必要としないでしょう。物事を単純明快にするために、実際の正規表現は引用符で囲まれたテキストとしてあなたに与えられるでしょう、そしてあなたはコマンドラインスクリーンショットでエスケープ構文を見るでしょう.
彼らはどのように展開するのですか?
正規表現は、あなたのコンピュータがそれらを複数のオプションに拡張できるように、用語を簡潔に表現する方法です。次の例を見てみましょう。
トム[0123456789]
角括弧 - [と] - は、構文解析エンジンに、内側にあるものが何であれ、任意の1文字を照合に使用できることを示します。大括弧の内側にあるものはすべて文字セットと呼ばれます。.
そのため、膨大な数のエントリのリストがあり、検索にこの正規表現を使用した場合、次の用語が一致します。
- トム
- tom0
- tom1
- tom2
- tom3
等々。ただし、次のリストは一致しないため、結果に表示されません。
- トマト ;正規表現は "tom"の後の文字を説明しません
- トム正規表現では大文字と小文字が区別されます!
文字が存在する限り、任意の文字の存在を許可するピリオド(。)で検索することもできます。.
ご覧のとおり、で
.トム
始めに「トム」しかない用語を思いつかなかった。 「tom」の前のスペースは文字としてカウントされるため、「green tomatoes」でさえ入ってきましたが、「tomF」のような用語は最初に文字がなかったので無視されました.
注意:Grepのデフォルトの振る舞いは、ある部分があなたの正規表現にマッチした時にテキスト全体を返すことです。他のプログラムはこれをしないかもしれません、そして '-o'フラグを使ってgrepでこれをオフにすることができます.
以下のように、パイプ(|)を使用して代替を指定することもできます。
speciali(s | z)e
これは両方見つけます:
- 特化する
- 特化する
grepコマンドを使用するときは、特殊文字(、|、および)をバックスラッシュでエスケープするとともに、 '-E'フラグを使用してこれを機能させ、見苦しいエラーを回避する必要があります。.
前述したように、これは、bashシェルに、これらの文字をgrepに渡し、それらを使用しないように指示する必要があるためです。 '-E'フラグはgrepに括弧とパイプを特殊文字として使うように伝えます.
角括弧の内側とセットの先頭の両方にあるキャレットを使用して、除外検索できます。
トム[^ F | 0-9]
繰り返しますが、grepとbashを使用している場合は、忘れずにそのパイプをエスケープしてください。!
リストに含まれていても表示されなかった用語は次のとおりです。
- tom0
- tom5
- tom9
- tomF
これらは私たちの正規表現と一致しませんでした.
環境を活用する方法?
多くの場合、境界に基づいて検索します。時には、単語の先頭、単語の末尾、またはコード行の末尾にのみ現れる文字列が欲しい場合があります。これは、アンカーと呼ばれるものを使用して簡単に実行できます。.
括弧の外側にキャレットを使用すると、行の「先頭」を指定できます。.
^トム
行末を検索するには、ドル記号を使用します。.
トム$
この場合、検索文字列がアンカーの前にくることがわかります。.
行全体ではなく、単語の先頭または末尾に表示される一致についてもできます。.
\
トム\>
この記事の冒頭のメモで述べたように、bashを使用しているので、これらの特殊文字をエスケープする必要があります。あるいは、一重引用符を使用することもできます。
結果は同じです。必ず二重引用符ではなく一重引用符を使用してください。.
高度な正規表現のためのその他のリソース
私たちはここで氷山の一角を打つだけです。通貨マーカーで区切られたお金の用語を検索したり、3つ以上の一致する用語を検索したりすることもできます。物事は本当に複雑になることがあります。正規表現についてもっと学びたいという方は、以下の資料をご覧ください。.
- Zytrax.comには、物事がどうしてうまくいくのか、また、なぜうまくいかないのかの具体的な例を含む数ページがあります.
- Regular-Expressions.infoには、便利なリファレンスページだけでなく、より高度なものへのキラーガイドもあります。.
- Gnu.orgにはgrepで正規表現を使うための専用のページがあります。.
RegExrという無料のFlashベースのオンラインツールを使用して、正規表現を作成してテストすることもできます。それはあなたが入力したとおりに動作し、無料で、そしてほとんどのブラウザで使用することができます.
正規表現のお気に入りの用途はありますか?それらを使用する素晴らしいバッチリネームを知っていますか?たぶんあなたはただあなたのgrep-fuについて自慢したいだけなのでしょう。コメントしてあなたの考えを投稿してください!