視覚障害者のための
正規表現入門7



【部分正規表現】
選択とまとまり」の項で、正規表現をまとめる丸括弧を説明しました。
 復習すると、正規表現、

山(田|中|下)

で、山田、山中、山下にマッチさせるというものでした。
この丸括弧のくくりには、もうひとつ別に用途があります。(すべての処理系でサポートされるわけではありません。代表的なPerlなどでは大丈夫です。Kazusoftのプログラムでもサポートしています。)

丸括弧で囲まれた内側に注目してください。
「田|中|下」となっており、これはそのままで、「田か中か下か」の選択を意味する正規表現になっています。こうした正規表現の一部分を、全体に対して、部分正規表現と呼ぶ場合があります。
そして、処理系によっては、その部分にマッチした部分だけを抽出できます。



例を変えます。
正規表現、

\d+年\d+月\d+日<.+>\s*.*

は、ある日記の日付部分にマッチするものです。日付は、

2003年2月7日<金曜日> 晴れ
2003年2月8日<土曜日> 雨
2003年2月9日<日曜日> 曇りときどき雨

という形式で書かれていると想定しています。 簡略化するため数字はすべて半角数字が使われているものとしています。全角数字を許容したい場合はどう修正すればいいか、ご自分で考えてみてください。
復習の意味をこめて細部を見ておきましょう。
「\d+年」というのは年号部分にマッチします。エンマークに半角小文字のdは半角数字、半角プラスは1回以上の繰り返しでしたね。処理系が{m,n}形式をサポートしていたら、\d{1,4}年としてもいいでしょう。正規表現\d{4}年なら、西暦年号だけにマッチします。\d{1,4}年としておくと、平成x年や昭和XX年の年部分にもマッチします。(「さまざまな表現」を参照)。
同様に、「\d+月」は月部分にマッチします。
「\d+日」は日部分にマッチします。
曜日は全角記号の大なりと小なりでくくられていると想定しているので、「<.+>」としています。
そして、曜日のあとに空白が存在して(「\s*」)、その後に天候が書かれているので、天候部分は「.*」にマッチさせます。\s+.+としていないのは、天候を書き忘れた日もあるかもしれないからです。


日記から日付部分を抽出する上述の正規表現についてはご理解いただけたと思います。
で、あるときふと思いついて、この日記を使って、曜日と天候の関係を調べたいと思ったとします。日記から曜日と天候部分だけを抜書きしたいわけです。そうしたときに便利なのが部分正規表現です。
正規表現を少しだけ変えて、

\d+年\d+月\d+日<(.+)>\s*(.*)

とします。
曜日にマッチする部分と、天候にマッチする部分をそれぞれ丸括弧でくくりました。
正規表現全体は、上述の、

2003年2月7日<金曜日> 晴れ
2003年2月8日<土曜日> 雨
2003年2月9日<日曜日> 曇りときどき雨

という日記の日付部分全体にマッチするのですが、マッチした日付部分全体から、曜日にマッチするところ、天候にマッチするところだけを、それぞれ取り出そうというのです。 スクリプト言語PerlやKazusoftのプログラムでは、これらは$1, $2という特殊な記号で表現可能です。つまり$1, $2によって取り出すことができます。
詳細は、それぞれのプログラムに譲りますが、理解していただきたい要点は、部分正規表現の名づけ方です。
多くの処理系では、左丸括弧を正規表現の左側から数えて、その丸括弧でくくられた部分を、順に、部分正規表現1、部分正規表現2、部分正規表現3・・・とします。丸括弧がたとえ入れ子構造になっていても、左丸括弧だけを、左から順に、数えるわけです。そしてPerlやKazusoftのプログラムでは、それらにマッチした部分を$1,$2,$3・・・記号で表現される変数(容器)に、格納するのです。

話が少しこしくなりましたが、Kazusoftのプログラムでは、各種のカスタマイズで、この部分正規表現を使うところがあります。それであえて触れました。


次の項目へ
前の項目へ
正規表現入門の目次ページ
文字主体トップページ







Copyright(C) 2003 Kazuhiro Kito All rights reserved