Grep で検索したり、ファイルの名前を一括変更できるプログラムを調べたりしたことがある人は、おそらく、仕事を完了するためのもっと簡単な方法はないかと疑問に思ったことがあるでしょう。ありがたいことに、「正規表現」と呼ばれるものが存在します。
(コミックは XKCD.com から)
正規表現とは何ですか?
正規表現は、非常に特殊な方法でフォーマットされたステートメントであり、さまざまな結果を表すことができます。 「 regex 」または「regexp」としても知られるこれらは、主に検索機能とファイル命名機能で使用されます。 1 つの正規表現を数式のように使用して、さまざまな出力を作成し、そのすべてを検索できます。あるいは、正規表現を指定してファイルのグループに名前を付ける方法を指定することもでき、ソフトウェアは次の目的の出力に段階的に移動できます。このようにして、複数のフォルダー内の複数のファイルの名前を非常に簡単かつ効率的に変更でき、単純な番号付けシステムの制限を超えることができます。
正規表現の使用は特別な構文に依存するため、プログラムは正規表現を読み取り、解析できる必要があります。 Windows および OS X 用のバッチ ファイル名変更プログラムの多くは、正規表現に加え、クロスプラットフォーム検索ツール GREP ( Bash Scripting for Beginners Guide で触れました) や *Nix 用の Awk コマンドライン ツールをサポートしています。さらに、多くの代替ファイル マネージャー、ランチャー、検索ツールでもこれらが使用されており、Perl や Ruby などのプログラミング言語において非常に重要な位置を占めています。 .NET、Java、Python などの他の開発環境、および今後の C++ 11 はすべて、正規表現を使用するための標準ライブラリを提供します。ご想像のとおり、プログラムに組み込むコードの量を最小限に抑えようとする場合、これらは非常に役立ちます。
文字のエスケープに関する注意
例を紹介する前に、指摘しておきたいことがあります。 bash シェルと grep コマンドを使用して、正規表現を適用する方法を示します。問題は、grep に渡す必要がある特殊文字を使用したい場合があり、bash シェルでもその文字が使用されるため、bash シェルがその文字を解釈してしまうことです。このような状況では、これらの文字を「エスケープ」する必要があります。この文字の「エスケープ」は正規表現内でも発生するため、混乱を招く可能性があります。たとえば、これを grep に入力したい場合:
\<
これを次のように置き換える必要があります。
\\\<
ここの特殊文字にはそれぞれ 1 つのバックスラッシュが付きます。あるいは、一重引用符を使用することもできます。
‘\<‘
一重引用符は、その中にあるものを解釈しないように bash に指示します。デモを行うためにこれらの手順を実行する必要がありますが、プログラム (特に GUI ベースのプログラム) では、多くの場合、これらの追加の手順は必要ありません。物事をシンプルかつわかりやすくするために、実際の正規表現は引用符で囲まれたテキストとして提供され、コマンドラインのスクリーンショットにはエスケープされた構文が表示されます。
どのようにして拡大するのでしょうか?
正規表現は、コンピュータが用語を複数のオプションに拡張できるように用語を記述する非常に簡潔な方法です。次の例を見てみましょう。
トム[0123456789]
角括弧 [ と ] は、内部にあるものは何でも、任意の 1 文字を使用して一致できることを解析エンジンに伝えます。これらの括弧内にあるものはすべて文字セットと呼ばれます。
したがって、膨大なエントリのリストがあり、この正規表現を使用して検索すると、次の用語が一致します。
- トム
- トム0
- トム1
- トム2
- トム3
等々。ただし、次のリストは一致しないため、結果には表示されません。
- トマト ;正規表現では「tom」の後の文字は考慮されません。
- トム ;正規表現では大文字と小文字が区別されます。
ピリオド (.) を使用して検索することもできます。これにより、文字が存在する限り、どの文字でも許可されます。
ご覧のとおり、grepすると
.tom
先頭に「トム」だけが付く用語は持ち出しませんでした。 「緑のトマト」さえも「tom」の前のスペースが文字としてカウントされるため含まれていますが、「tomF」のような用語は先頭に文字がなかったため、無視されました。
注: Grep のデフォルトの動作では、一部の部分が正規表現と一致する場合、テキストの行全体が返されます。他のプログラムではこれを行わない可能性がありますが、grep で「-o」フラグを使用してこれをオフにすることができます。
次のように、パイプ (|) を使用して代替を指定することもできます。
特殊な
これにより、次の両方が見つかります。
- 専門化する
- 専門化する
grep コマンドを使用する場合、これを機能させて醜いエラーを回避するには、特殊文字 (|、および ) をバックスラッシュでエスケープし、「-E」フラグを利用する必要があります。
上で述べたように、これは、これらの文字を grep に渡し、それらの文字に対して何もしないように bash シェルに指示する必要があるためです。 「-E」フラグは、括弧とパイプを特殊文字として使用するように grep に指示します。
角括弧内とセットの先頭の両方にあるキャレットを使用して、除外して検索できます。
トム[^F|0-9]
繰り返しますが、grep と bash を使用している場合は、そのパイプをエスケープすることを忘れないでください。
リストに含まれていたが表示されなかった用語は次のとおりです。
- トム0
- トム5
- トム9
- トムF
これらは正規表現と一致しませんでした。
環境をどのように利用できますか?
多くの場合、境界に基づいて検索します。場合によっては、単語の先頭、単語の末尾、またはコード行の末尾に表示される文字列だけが必要な場合があります。これは、いわゆるアンカーを使用して簡単に行うことができます。
キャレット (括弧の外側) を使用すると、行の「開始」を指定できます。
^トム
行末を検索するには、ドル記号を使用します。
トム$
この場合、検索文字列がアンカーの前に来ていることがわかります。
行全体ではなく、単語の先頭または末尾に出現する一致を検索することもできます。
\<トム
トム\>
この記事の冒頭の注で述べたように、bash を使用しているため、これらの特殊文字をエスケープする必要があります。あるいは、一重引用符を使用することもできます。
結果は同じです。二重引用符ではなく、必ず一重引用符を使用してください。
高度な正規表現に関するその他のリソース
ここでは氷山の一角にすぎません。通貨マーカーで区切られた金額条件を検索したり、3 つ以上の一致する条件のいずれかを検索したりすることもできます。事態は非常に複雑になる可能性があります。正規表現についてさらに詳しく知りたい場合は、次のソースを参照してください。
- Zytrax.com には、一致する理由と一致しない理由の具体的な例が記載されたページがいくつかあります。
- Regular-Expressions.info には、便利なリファレンス ページだけでなく、より高度な機能の多くについてのキラー ガイドもあります。
- Gnu.org に は、grep での正規表現の使用に特化したページがあります。
RegExr と呼ばれる無料の Flash ベースのオンライン ツールを使用して、正規表現を作成してテストすることもできます。入力と同時に動作し、無料で、ほとんどのブラウザで使用できます。
正規表現のお気に入りの使い方はありますか?これらを使用する優れたバッチ リネーム機能をご存知ですか?もしかしたら、自分の grep-fu を自慢したいだけなのかもしれません。コメントしてあなたの考えを投稿してください!





