sedは日暮れて:第3回 正規表現地の巻

さて今週もやってきました、sedは日暮れてのコーナーです。はたして本当にperlにまでたどり着けるんだろ~か?(^^;と茫洋たる未来に思いをはせてくらくらくらと眩暈さえ覚える今日この頃ですが。正規表現の不思議の国へ一緒に参りましょう、アリスたち。 

メタキャラクタのお話です。前回の終わりに書いた、変数として働く文字でしたね。基本は、

. * ^ $ [ ]

の6つです。上のはじめの文字はゴミではなくドットですので念のため(笑)もちろんこの他の文字もありますけれども、それは後の回になってひょっこり出てくると思いますのでよろしゅうに。ではこれらの文字の説明をば。

その1: . (ドット)
これは、DOSのワイルドカードでは「?」にあたるものです。つまり改行以外の任意の一文字を意味します。DOSではあんまりワイルドカードとして「?」を使わないですよね?でも正規表現ではよく使うんです、このドットを。同じ役目をするのにこの違いはなんだろ。その謎は次の項ではやくも解き明かされます。

その2: *(アスタリスク)
くせもの登場なり。ゆめ油断めさるな。なぜってこれは、DOSの*と似て非なるものですもの。DOSでは、*は、複数の文字の代わりであって。よくすべてのファイルを表現するのに「*.*」としたりしますよね。
でもでも正規表現では。*は、直前の文字の0回以上の繰り返しとなっちまうですだよ。え!違いがわかりにくいですって?そういうときは例だあ。

とにかく先頭がcである単語を表現したいとします。 DOSでは、「c*」でOKですよね。ちなみに、cではじまるファイル名、拡張子は何でもよいのならば、「c*.*」とするのは言わずもがなでしたか。

それが、正規表現の場合だと、「c*」とすると先頭にcがついているファイルもついていないファイルもぜ~んぶ指してしまうことになるのん。なぜなら、正規表現の*は、直前のcの0回以上の繰り返しすなわち「cがあってもなくてもいいぞ!」という意味になるからです。じゃあどうすればいいんでしょう?答えは、「c.*」というふうに、cの次に任意の一文字を表す「.」を入れておく。すると、「cの次に何か文字があったりなかったり(=.の0回以上の繰り返し)」となってcではじまる単語を指してくれるようになります。ほっ。

さっき前ふりした、ドットをよく使う謎というのは、このあたりにかかわってくるのでして。「.*」としてはじめてDOSの「*」と同じく任意の長さの文字を表わせるのようになるからでした。単独の*って使う意味がないのです。これってよく考えるとすごくない?正規表現の*は存在と非存在の両方を含んでるですもん。おお。これをもとに宗教とかつくれるんじゃないでしょうか?つくんないですけど(笑)

その3: ^(サーカムフレックス)
使い方というか、使う位置によって実は意味が2通りにわかれるのですが、ここでは まず、普通の使用法を書きます。^は、行頭という意味です。 「^、」だと行頭にきている「、」のことになります。

その4: $(ドル記号)
約100円。うそうそうそうそ。えと、上の^とちょうど反対で、行末のことです。「す$」とすれば、行のいっちゃん最後が「す」で終わっているものが探せますね。じゃあサーカムフレックスと組み合わせて^$とするとどうなるか。「行末が先頭である。」ふうむ。つまり、中味がなにもない(注:スペースさえも入ってない)空行ですね。

その5: [ ](ブラケット)
スヌーピーの仲間でライナスくんているでしょ?彼がいつも肌身離さずもっているものです。←それはブランケットでしょ~が!どもしっつれ~しました!(構想2日ギャグ)あんまりこんなことばっか書いていたら真剣に読んでもらえないかしら。しくしく。

ええと。本当の意味は中に入っている文字のどれかひとつにあてはまるということ。たとえば。日本語の格変化にこれを使えば便利。文章の中で、動詞の「歩く」をぜ~んぶ抜き出してしまいたいとき。歩の字だけ書いたら、名詞の「徒歩」とか「競歩」とか「歩のない将棋は負け将棋~」(笑)とかいらないのががんがん抜き出されてしまいます。ううう。

やはりここは。動詞だけのもつ性質を考えんといかあん!つまり。歩くは、5段活用でしょ、歩かない、歩きます、歩く、歩くとき、歩けば、歩け、歩こう。ああ。イ音便もあったぞ。歩いて。ということは。動詞では、歩の次にくる文字は、「い、か、き、く、け、こ」の6通りしかな~い。歩[いかきくけこ]とすればおおぶらぼお!あ。でもこれでも「徒歩か。ああしんど」というのが出てしまいますが(^^;話が深入りしすぎるのでここでは、更に精度をあげる話はやりませんです。ごめごめね。
まとめておくと。A[BC]は、AB、あるいはACという意味ですよん。

その6: (日本語キーボードでは円記号・英語ではバックスラッシュ)
約0.01ドル。←ってもういいってば。しつこいなあ(^^;。これは、エスケープです。正規表現でつかうメタキャラクタの意味をなくしちゃう記号です。

おれはこのドットを「任意の一文字」じゃなくて「ほんとおおおにほんとおおのドット、英語の文末に打つやつ」として書いてるんだよわかってくれよおお(;_;)と泣くかわりに、¥.と打ちましょう。すると、正規表現ならではの意味はなくなって、ただのドットになります。同様に、*も^も[ ]もその他ここに書いていないメタキャラクタも、そのすぐ前に¥をつければ、すべてメタじゃない普通の文字に戻してくれます。

以上、地の巻では大急ぎで主なメタキャラクタについて書きました。次回正規表現の最終回、人の巻はメタキャラクタの組み合わせの予定なり。ではではまた来週!ごきげんよう!

第4回

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です