PR

 正規表現(せいきひょうげん)とは,ある文字の並びを使って,より複雑な文字の並びを表現する方法です。最も広く知られている例は「*」と「.」でしょう。「*」は直前の文字の0個以上の並びを,「.」は何らかの1文字を表します。正規表現を使うと,わずかな文字を書き下ろすだけで,柔軟な文字列の表現が可能になります。これが正規表現を使う理由です。

 行として表現されたデータを処理するプログラムであれば,正規表現を使うことで文字列処理が単純になります。ログ・ファイルやHTML,プログラムのソース・コードは行で表現されていますから,正規表現が役立ちます。エディタ・ソフトウエア(エディタ)も行で表されたデータを扱います。エディタで正規表現や役立つのは文字列の検索,置換でしょう。シェル(関連ページ) であれば,ファイルを柔軟に指定できるようになります。例えば,ファイル(sample.txt)中で,行頭が「t」から始まっている行をすべて表示するには,grepコマンドを使って次のように打ち込みます。正規表現を使わないで同じような結果を得るのは難しいでしょう。

$ grep '^t.*' sample.txt

 正規表現は,歴史的には1940年代の形式言語論に由来しますが,C言語とUNIXの開発に貢献したKen Thompson氏が1970年前後にQEDというエディタ・ソフトウエア(エディタ),ついでedと呼ばれるUNIX上のエディタに文字列検索用として組み込んだことから,コンピュータの世界でも利用されるようになりました。続いて,文字列検索コマンドgrep,スクリプト言語awk,Emacsとviエディタへと正規表現は広がっていきます。

 正規表現は,POSIXの標準,すなわち「POSIX Part2:Shell and Utilities」として標準化されています。しかし,さまざまなエディタ,プログラミング言語,シェルは,かならずしもPOSIX標準で定められた表現をすべては実装していません。さらに独自に拡張した正規表現も含めています。従って基本的な正規表現を覚えたら,用途に応じて「方言」に習熟する必要があります。
 具体的な正規表現をいくつか紹介しましょう。

●ある1文字を表す方法
 冒頭で紹介した「.」を使うと,任意の1文字を表現できます。「A.」であれば,AaやAX,A5などを検索できます。複数の文字から1つを選ぶ場合は「[]」が使えます。例えば,[xyz]と書くと,xか,yか,zの1文字を表します。[a-d]ならば,aからdの間の文字,つまり,a,b,c,dのうちの1文字を表します。[0-9]とすれば,0から9までのすべての数字を表すことになります。

●複数文字を表す方法
 例えば,「a.b」と書くと,aabやaeb,a3bなどを表現できます。しかし,この方法では文字列の長さが決まっていない場合に対応できません。そこで,「*」を使います。例えばXで始まりYで終わる文字列だけを検索する場合は,「X.*Y」と書けばよいわけです。直前の文字が0個または1個あることを表す「?」も役に立ちます。「ABC?」と書くと,ABかABCに相当します。

●2つの文字列から一つを選ぶ方法
 「東京」もしくは「大阪」を選択したい場合,「.」や「*」だけではうまく表現できません。このような場合は「東京|大阪」と書きます。

●行の性質を生かす方法
 行には先頭と末尾があります。行頭や行末を表現するにはどうすればよいのでしょうか。行頭は「^」,行末は「$」と記述します。例えば,3ケタの数字だけから構成されている行を検索するには,「^[0-9][0-9][0-9]$」と書けばよいのです。

 このほか,文字列をグループ化する「()」,*や.自体を表現したい場合に役立つ「\」,文字の繰り返し回数を表現する「\{n,m\}」などさまざまな正規表現があります。

■変更履歴
シェルでの実行例に誤りがありました。
「例えば,カレント・ディレクトリにあるtで始まる全ファイルを一覧表示したい場合,Linuxなどでは次のようにコマンドを打ち込みます。」

「例えば,ファイル(sample.txt)中で,行頭が「t」から始まっている行をすべて表示するには,grepコマンドを使って次のように打ち込みます。」
に,
「$ ls t*」

「$ grep '^t.*' sample.txt」
に訂正しました。[2006/07/14 21:50]

■変更履歴
「●ある1文字を表す方法」を紹介した部分に誤りがありました。
  [0-9]とすれば,すべての文字を表すことになります。

  [0-9]とすれば,0から9までのすべての数字を表すことになります。
に訂正しました。[2006/07/10 16:00]