"Regular Expression" #1
Riue ちゃんの正規表現講座 / 其壱
正規表現とは何でしょうか。そして、正規表現が利用出来ると何が嬉しいのでしょうか。 ここでは、正規表現と、正規表現の世界で利用される用語について、簡単に説明します。
正規表現とは何か?
「正規表現」という言葉をご存知でしょうか? UNIX 使いでないと、あまり耳慣れない単語かもしれません。
正規表現は、幾つかの文字列を一つの形式で表現するための表現方法です。通常、文字列を表現する場合は
- 123
- Macintosh
- PowerPC 601
というような感じで、単純に文字をタイプします。でも、例えば、
- 「100」で終る文字列
- 「LC」で始まり、途中にスペースがあって、「I」が幾つか続く文字列
- 「PowerPC」で始まってー、数字 3 桁の型番が続いてー、でもー、最後にー、 もしかすると「e」がついちゃうかもしんないしー、つかないかもー、 といった文字列
などというものを表現する場合は、普通の表現だとうまくいきません。 でも正規表現を使えば、いずれもそれぞれ
.*100LC *II*PowerPC [0-9]\{3\}e*
という形式で表現することが出来てしまいます。
正規表現は、文章の修正・校正・検索・置換などの作業に威力を発揮します。 勿論、正規表現は表現でしかありませんから、正規表現を扱えるエディタ、或いはツールが必要であることは言うまでもありませんが。
ここでは、この正規表現について簡単なレクチャーをしてみます。 ぜひ正規表現に親しんで、日頃の作業がより簡単になるようにしてみて下さい。
ところで、私の知る限り、「正規表現を GUI によって構築するツール」というものは世の中には存在しないように思います。 というわけで、Macintosh な人も PlayStation な人も、素直にキーボードで正規表現を打ち込んでみて下さい。
正規表現は UNIX 使いのもの?
テキスト処理を得意とする UNIX のコマンド群では、その柔軟性と利便性が買われて、正規表現をインプリメントしたものが少なくありません。 このような事情からか、「正規表現は UNIX 使いの特権」なとという誤解をされる方が稀におられます。
でも、最近では Macintosh やWindowsなエディタにも正規表現を扱う機能は採り入れられていますし、 UNIX 伝統のツール群もいろいろなプラットフォームに移植されています。 また、最近の所謂「いんたーねっとぶーむ」のおかげで「Perl」 という言語が注目を浴びていますが、Perl を使いこなすには正規表現の習得が必須です。
というわけで、この際 Macintosh 使いの方も、Windows を使っておられる方も、正規表現を覚えておいて損はないなどと思います。 いつの日か「正規表現の強制習得に関する法律(愛称:正規表現法)」なんつーのが誕生して、 「正規表現ヲ習得セザル者ハ二年以上五年未満ノ懲役ニ処ス」なんて言われないとも限りませんから。
まずはこの世界の用語の説明から…
正規表現について説明するのですから、まずはこの世界で日常的に使われる単語について、 軽く解説しておかなくては、ですね。
- マッチする
-
「マッチ擦る」とかいう変換をすると、何が何やら分からない状態になってしまいますが…。 「マッチする」とは、「ある正規表現がある文字列に合致すること」を意味します。
例えば、「
a.*」 は「apple」にも「application」にも合致する ― つまり、「a.*」という正規表現は 「apple」や「application」を表すことが出来る正規表現ですが、 このようなとき「『a.*』は 『apple』にも『application』にもマッチする」と言います。 逆に「『a.*』がマッチする文字列」と言った場合は、 「apple」や「application」などがその例となります。 - RE
-
「正規表現」の英語表記「Regular Expression」の頭文字を取ったものが 「RE」です。 よく、正規表現の例示をするときに用いられる略称です。 ちなみに、NetNews やパソコン通信で用いられる「RE:」とは全然全く何の関係もありません。
本項では、正規表現の例示として「RE」を使用する場合は、 RE と表示します (abbr 要素を使っているので、一部のブラウザでは何の変哲もない「RE」にしか見えませんが)。
- メタキャラクタ
-
日本語では「超文字」と訳されるみたいですね。最近の若者に言わせれば 「チョー文字」という感じなのでしょうか。そうそう、 「VLSI」のことも彼らは「チョー LSI」とかって言うらしいですよ(言わないと思う)。
メタキャラクタは一見すると普通の文字に見えますが、 一般の文字とは異なり、その文字自身に特別な意味が割り当てられています。 これらの文字に割り当てられた特別な意味によって、正規表現は「使える」ものとなっているのです。
メタキャラクタには、行の先頭を表す「
^」や、 集合内での否定を表す「^」などがあります。 「何やおんなじ文字やんけ」と言われそうですが、 このように「文脈によって意味が変わる」メタキャラクタもありますから、注意が必要ですね。 - 空文字列
-
通常、文字列は 1 文字以上の連続する文字によって構成されます。 でも、0 文字、つまり、1文字も文字がない場合でも「文字列」と見做されるのです。 このように、1 文字も文字がない…つまり、まるっきり空っぽの文字列を「空文字列」と言います。
例えば、「this」という文字列は「t」「h」「i」「s」の 4 文字から構成されている文字列ですが、「t」「空文字列」「h」「i」 「空文字列」「s」から構成されている文字列である、と言い切ってもいいわけです。
勿論、「t」「空文字列」「空文字列」「空文字列」 「空文字列」「空文字列」「空文字列」「空文字列」「空文字列」 …(100 回位繰り返してみましょう)…「h」「i」「s」、 などと言ってもいいのですが、キリがないのでやめておきます。
正規表現のレベル
RPG の主人公に限らず、世の中の全てのものにはレベルというものがあります。 一般的にはレベルが上のものほど「強力」「使える」「ナイスガイ」という感じになるようです。
正規表現にも、その強力さに応じて様々なレベルがあります。 もっとも、ここでの定義は私個人の定義ですから、一般には通用しないかもしれません。
- ed レベル
-
一番基本的な正規表現ですが、普段使う分にはこれで過不足ないと思います。 ちなみに「ed」というのは、UNIX 伝統のラインエディタのことでして、 これにインプリメントされている正規表現がこのレベルに当たります。
なお、ed のコマンドや正規表現をほとんど受け継いだ「sed」という、これまた UNIX 伝統の奇妙なエディタもあります。
- egrep レベル
-
UNIX 伝統のテキスト検索コマンド grep の「拡張正規表現版」である egrep にインプリメントされている正規表現です。 ed レベルの正規表現と比べて、様々な便利な機能が加わっています。
- Perl レベル
-
別に CGI のための言語というわけではないのですが、最近では UNIX 使い以外にも使う人が増えている Perl。 Perl の正規表現は様々な場所から盗…いや、受け継いできた機能でテンコ盛りです。 こんなに巨大なものを最初から覚えようとすると混乱するのがオチですので、 ゆっくり覚えていけばいいのではないかと思います。 多くの拡張は「機能拡張」というよりも「読みやすさの向上」のためのものですから。
この講座では、とりあえず最初の「ed レベル」から順番にお話ししていきます。