Skip to main content.

"Regular Expression" #4

Riue ちゃんの正規表現講座 / 其四

本講座も早くも 4 回目。これも単に皆様のお蔭で御座います…って、そんなこと言えるほど読者ついてないくせに。

さて、今回は「ed レベル」の正規表現の最終回です。ここまでのことをちゃんと覚えると、いっぱしの正規表現が完全に扱えるようになります。

位置関係を考える

前回までの講座では、基本的に「文字の表現の仕方」と「文字列の表現の仕方」について書かせていただきました。 とは言え、今まで得た知識だけでは、単に正規表現で文字列を表現出来るになったに過ぎません (少年ジャンプ的に言うと「ヤツは我々の中では一番の小物」っていう感じですね)。

というわけで今回のテーマは、位置です。 今回の内容を覚えると、正規表現の使い道がグッと増えますよ。

まず、先頭から

「位置がテーマ」とか言われても、それだけではピンと来ませんよね。どういうことかと言いますと、

正規表現では、位置を表現するメタキャラクタを使うことが出来る。

ということなのです。

まず、「行の先頭」という概念を表現するメタキャラクタを説明しましょう。

^

以前に出て来た、「[]」内での否定を表す「^」と混同しないで下さいね。尤も、通常は一目見ればわかりますから、心配はいりません。

というわけで、早速例を見ましょう。

^a

行の先頭にある「a」がマッチの対象になります。行の中に「a」があっても、それはマッチしません。 ですから、「a cup of tea」のような文字列があった場合、先頭にある「a」だけがマッチすることになります。

^[0-9][0-9]

同じように、行の先頭にある「数字 2 桁」がマッチの対象になります。

^.*dra

行の先頭から、「dra」という文字列までがマッチの対象になります。

.*」は、「任意の文字の 0 文字以上の連続」を表すことを思い出して下さい。 ですから「.*」は、「どんな文字列にでもマッチする」わけです。

次のような文の場合、強調した部分までがマッチの対象になります。

Macintosh Quadra 950
Quadra 700
123456 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 レベルの正規表現を取り上げますです。ではまた。