"Regular Expression" #4
Riue ちゃんの正規表現講座 / 其四
本講座も早くも 4 回目。これも単に皆様のお蔭で御座います…って、そんなこと言えるほど読者ついてないくせに。
さて、今回は「ed レベル」の正規表現の最終回です。ここまでのことをちゃんと覚えると、いっぱしの正規表現が完全に扱えるようになります。
位置関係を考える
前回までの講座では、基本的に「文字の表現の仕方」と「文字列の表現の仕方」について書かせていただきました。 とは言え、今まで得た知識だけでは、単に正規表現で文字列を表現出来るになったに過ぎません (少年ジャンプ的に言うと「ヤツは我々の中では一番の小物」っていう感じですね)。
というわけで今回のテーマは、位置です。 今回の内容を覚えると、正規表現の使い道がグッと増えますよ。
まず、先頭から
「位置がテーマ」とか言われても、それだけではピンと来ませんよね。どういうことかと言いますと、
正規表現では、位置を表現するメタキャラクタを使うことが出来る。
ということなのです。
まず、「行の先頭」という概念を表現するメタキャラクタを説明しましょう。
^
以前に出て来た、「[]」内での否定を表す「^」と混同しないで下さいね。尤も、通常は一目見ればわかりますから、心配はいりません。
というわけで、早速例を見ましょう。
-
^a -
行の先頭にある「a」がマッチの対象になります。行の中に「a」があっても、それはマッチしません。 ですから、「a cup of tea」のような文字列があった場合、先頭にある「a」だけがマッチすることになります。
-
^[0-9][0-9] -
同じように、行の先頭にある「数字 2 桁」がマッチの対象になります。
-
^.*dra -
行の先頭から、「dra」という文字列までがマッチの対象になります。
「
.*」は、「任意の文字の 0 文字以上の連続」を表すことを思い出して下さい。 ですから「.*」は、「どんな文字列にでもマッチする」わけです。次のような文の場合、強調した部分までがマッチの対象になります。
Macintosh Quadra 950Quadra 700123456 89 0543 jfoda dsa fde i dranobiマッチ対象部分が行頭から始まり、「dra」で終わっていることがお分かりでしょうか?
俺のケツを舐めろ
さて、「『行の先頭』っつー概念を表現するメタキャラクタ」があるんでしたら、 「『行の最後』という概念を表現するメタキャラクタ」もないと、不公平ですね。 もちろん、ちゃんと用意されています。
$
「行の最後」ということを示したいときは、「$」を使います。
これも、例を見て頂いたほうが速そうですね。
-
a$ -
行の最後にある「a」がマッチの対象になります。ですから、先程の「
^」のときに出した 「a cup of tea」のような文では、今度は行の最後の「a」だけがマッチすることになります。 -
7200$ -
行の最後にある「7200」がマッチの対象になります。
-
^$ -
これは「
.*」と並んで、「定石」と呼ばれるべき表現ですね。 「行の先頭から行の最後まで文字が一つもない」ことを意味していますから、 この表現は「空行」を意味する正規表現になります。 よく使われますから、覚えておいて損はありませんよ。 -
^.*$ -
これもほとんど「定石」ですね。 先程の「
^$」に似ていますが、今度は途中に「.*」が入っています。 つまり、「任意の一行」を表現する正規表現になります。 ちょうど「.」がどんな文字にでもマッチしたように、 「どんな行にでもマッチする」正規表現だということになりますね。 -
^RE$ -
「定石」シリーズ第3弾。お忘れかもしれませんが、本講座において 「RE」は、任意の正規表現を表します。 つまり、行全体が RE で示した正規表現と一致するような行にマッチします。 例えば、次の正規表現は「Windows 95」か「Windows NT」とだけ書かれた行にマッチします。
^Windows [N9][T5]$
例外壱 : 単語のアタマとオシリ
さて、文の先頭と最後が指定出来るのでしたら、 単語の先頭と最後というのが指定できてもいいですよね。 もっとも、正規表現にはそもそも「単語」っていう概念はありませんから、 これはちょっと変かもしれませんが…。
正規表現で「単語」を表現しようと考えた場合、単純に考えれば
[^ ]*
つまり「空白文字を除く任意の文字の連続」という表現などを使うことになるでしょう。
勿論、単語の区切り文字としてそれ以外…例えば「,」を使う場合などもありますから、
一概には言えませんが。
というわけで、「単語の先頭と最後」を定義するには、次のようなメタキャラクタを使います。
\<- 単語の先頭
\>- 単語の最後
ただ、この2つのメタキャラクタは、其参で説明した「\{\}」と同様、
egrep レベルの正規表現では使えません。
それでは、例を見てみることにしましょう。
\<Mac\>見ての通り、「Mac」という単語にマッチします。 ですから、「Macintosh」や「MacOS」の「Mac」という部分にはマッチしません。 「Mac OS」なら、最初の「Mac」の部分にのみマッチします。
^Windows\>行の先頭にある、「Windows」という単語にマッチします。 「Windows 95」のという文字列が行の先頭にあった場合、「Windows」という部分だけがマッチの対象になります。 行の先頭にあっても、「Windows95」という単語の「Windows」部分にはマッチしません。
例外弐 : 直前にマッチした部分を後で使う方法
ed というラインエディタの機能の中には、「直前にマッチした部分を、後から参照することが出来る」 という素晴らしい機能があります。 尤も、ed はラインエディタなので、この機能がなければ編集もままならないのですが。
これは先の厳密に言うと、先に挙げた「\<\>」同様、
「正規表現」ではありません。また、egrep レベルの正規表現では使えませんが、
とりあえず紹介しておきましょう。
まず、マッチした部分を参照できるように記憶させるには、
\(RE\)
というように、正規表現全体を「\(」と「\)」で囲みます。続いて、
\番号
というように、マッチした順番を番号で指定します。
「\1」、「\2」といった具合ですね。
但し、ここでは「1」から「9」の 9 つまでしか使うことが出来ません。
\(Net\).*\(Navi\).*
という正規表現を「Netscape Navigator」という文字列に対して適用しますと、
最初の「Net」が「\1」に、次の「Navi」が「\2」に格納されます。
後から「\1」を参照するとそれは「Net」に、
「\2」を参照するとそれは「Navi」に置換されます。
この記法の便利さは、実際に grep や sed、ed を使っていただけないと分からないかも知れません。 しかし、本講座は「正規表現講座」であって、「sed 講座」や「grep 講座」ではありませんから、 詳しい説明は割愛させて頂きます。 「ed レベルの正規表現にはこんな機能もあるんだな」程度に捉えておいて下さい。
とりあえずのおしまい…ed レベル
今回は「位置」をキーワードに書いてみました。この「其四」までで ed レベルの正規表現は全て紹介しましたから、ed や sed、grep で正規表現を使うぶんには、全く問題がないはずです。
正規表現は、例を見てたり説明を読んでいるだけですは、なかなか使えるようになりません。 是非、日常の作業でも正規表現を使ってみて下さい。
次回からは egrep レベルの正規表現を取り上げますです。ではまた。