#082 正規表現のススメ

1999/09/23

<前目次次>


 パソコンを使って大量の文章やデータを処理する場合、似たような表現を別の表現に改めたい、などというケースはよくある。その場合、それらを一つ一つ目の子で探して修正するのは手間もかかるし間違いの元であるし、だいたいパソコンに使われているという感じがしてよろしくない。そんな時に、正規表現というものを使いこなせると、そういった単純作業から解放され、嘘のように仕事の能率があがるものである。私もパソコンを使って物を書くようになって6年くらいたつが、正規表現という概念を知った時は、パソコンでFEPを使って日本語を入力できることを知った時の次に衝撃的で革命的なことであった。

 この正規表現というもの。もともとは「Regular Expression」という英語を訳したものなのだが、どっちにしろ字面だけでは何のことやらわからないものなので、知らない人も多いのではないかと思う。しかし、あなたがもしパソコンを使って文章を書いたりデータの処理をする人であれば、これを知っていると知らないとでは、パソコンの使い勝手が64〜1024倍(当社比)違うこと請合いである。普通の人が8時間かかってやる仕事をもし5分で終えることができたなら、残りの7時間55分は(サボっているのがばれない程度に)好きなことをして過ごしていても同じ報酬がもらえるのだから、ともかく学んでおいて損はない

 正規表現というものを端的に言い表すなら「複数の(曖昧な)パターンを表現する手法」ということにでもなるだろうか。この手法を用いれば、文章中に含まれる様々なパターンの文字列を一瞬にして検索したり置換したりすることができるのである。人間は「違うものだけれども似ているもの」を一まとまりにして考えるような頭脳を持っているので、正規表現を使うことは、このような人間の思考パターンに照してみても非常に理にかなったものなのである。

 例えば、文章の先頭にある「第○章」という言葉の先頭に★マークをつけたい、などと思った場合、あなたはどうするだろうか。これが数個であれば、目で追って一つ一つ直して行けばいいのだろうか、何ページもある文章のなかからこれに該当するものを見つけるのは骨の折れることであるし、見逃しなどの間違いのもとである。こんな時、正規表現を使ったsedによる置換操作を使えば、次のようなコマンドで一瞬にして終わってしまうのである。

  sed 's/^\(第[0-9]+章\)/★\1/' oldfile >newfile

 また、前にも出した事例であるが、今年初めから切り替わった移動体電話の番号を更新する場合、間にはさまった数字を4桁目に移して090-にして…などという作業を手作業でやっていたのでは大変なことである。これも正規表現とsedを使えば、以下のコマンド一つで一発で置換可能である。

  sed 's/0\([123489]\)0-/090-\1/' oldfile >newfile

 このように、いくつかのパターンに照合(マッチ)するような表現を正規表現と言うのである。変な記号が並んでいてとっかかりづらいかも知れないが、慣れてしまえばだんだん複雑なパターンも表現できるようになり、便利に使えるものである。それは、人間を単純作業から解放し、知的な生産活動へと昇華させるという、コンピュータユースのあるべき姿そのものであると言えるだろう。

 なお、正規表現はgrep, sed, AWK, Perl と言ったUNIX発祥のコマンドにサポートされているが、最近では気の効いたワープロやエディタであれば、正規表現を使った検索や置換機能は備っているものである。従って、正規表現をある程度マスターすれば、上の様なコマンドを使って一括処理をしたい場合はもちろんのこと、エディタを使っている時でも「似たようなパターンが並んでいる部分の表現を一度に変えたい」などというファジーな要求に的確に応えてくれるのである。

 前置きが長くなってきそうなので、今回はこのくらいにして、次回から様々な正規表現について具体的に解説していくことにする。


<前目次次>