▲ゴト技top| 第11章 1| 2| 3| 4| 5| 6| 7| 8| 9| |
[第11章●そろそろ正規表現はいかがですか] 6… 正規表現のエッセンスかも |
[2004.02.09登録] |
石田豊 |
今回紹介するメタキャラクタは行頭、行末、そしてグループ化です。このみっつのメタキャラクタは他のとはちょっと違った感じで使うので、最初はとまどうかもしれませんが、慣れると実に強力です。 行頭は「^」行末は「$」で表します。行頭とか行末とは、要するに改行コードの前後ってことです。もうちょっと正確(っていうか伝統的)にいうと行頭・行末より段落頭・段落末です。 たとえば「^あ」は行頭にある「あ」を示します。ほかの場所にある「あ」はヒットしません。 また「。$」と書くことで、行末にある「。」(句点)にヒットします。これも他の場所にある句点にはヒットしません。 「^注:. \n」を「ナンニモナシ」に置換すると、「注:」で書き始められた全ての行を削除することができます。 文章を書いていると、時として行末に不要な空白やタブコードが混入しちゃうことがあります。こういうのはプリントアウトでも画面でも確認しにくいので、最後の最後まで残ります。実害は少ないのですが、カッコ悪いので取ってしまいたい、というような場合は 「[□△\t] $」→ナンニモナシ の置換を行います(ここでも□は全角、△は半角のスペースだとみなしてください)。これで行末の見えない文字はすっきりと刈り込むことができました。 この正規表現置換は 「[□△\t] \n」→\n でも同様の結果が得られます(ただしmiの場合は\nではなく\r)。この方法と$を使った方法のびみょーな違いの中に、メタキャラクタ「^」「$」の特殊性が見えてきます。後者の方は、置換文字列として\nを与えています。「一個以上の半角・全角空白の連続で改行」を「改行」に置換という考え方です。いっぽう「$」を使った前者は違います。置換文字列の中には(再帰的に)「$」を指定することはしなくていいのです。 他のメタキャラクタがなんらかの意味でキャラクタに置き換えられるのに対し、「^」「$」は「場所」を示すだけで、現実のキャラクタに対応するわけではありません。 これは私だけのことかもしれませんが、この「妙」な性格がなじめないのか、なかなかスマートに使いこなせないメタキャラです。 ともあれ、 「[□△\t] $」→ナンニモナシ 「[□△\t] \n」→\n は、先ほど「同様の結果」と書きましたが、ホントはちょっとだけ違います。それは最後の行です。最後の行には改行がありませんから、その行の末尾にスペースやタブがあっても削除されません。 「^」「$」は地味ではありますが、なかなかキュートな存在です。ま、押さえておくべきか、と。 ということで、次。 グループ化です。 この「章」の初回(「悲しき高野豆腐」)でチラっと紹介したChapter7を第7章に置換したいというニーズ。Chapter+数字を一括で指し示す正規表現は、すでにダイジョブですよね。 「Chapter[0-9]+」 もしくは 「Chapter\d+」 Chapterと数字の間に、もしかしたら半角スペースが入っているかもしれない、というおそれがあるなら、 「Chapter△?\d+」 って書いとけばいいですね。例によって△は半角スペースです。実際に入力するときは半角スペースを打って下さい。 問題は置換です。全てのChapterなんとかを第8章に置き換えるならカンタンですが、数字の部分が全部違う。じゃあどうする、ってときにグループ化を使います。 「Chapter△?(\d+)」 先の正規表現の数字の部分をカッコでくるんだだけです。カッコでくるむことで、その部分の表現を「グループ化」するわけです。 で、グループ化したものは、置換欄で使い回すことができます。置換欄には、 「第\1章」と書きます(ただしK2Editorで。miでは\1\2のところを$1$2と書く)。 もひとついきます。「2004.7.14」といったふうな日付の書き表し方があります。文中のこういう表現を「2004年7月14日」というふうに直したい。検索の方は、 「\d\d\d\d\.1?\d\.[1-3]?\d」 っていうわけのわかんないものになります。まず数字が4桁(\d\d\d\d)あって、その後にピリオド。しかしピリオド「.」はメタキャラクタ(「改行以外の任意の一文字」)ですから\でエスケープしています(\.)。次は「1?\d」で「1」が1回あるかないかでそのあと1桁の数字。これで月が表現でき、[1-3]?\dで日が表現できます。ま、若干ツメが甘いところがありますが、経験的にはこれでほぼ大丈夫。他と取り違えちゃう心配はほとんどないでしょう。 これをグループ化を使って 「(\d\d\d\d)\.(1?\d)\.([1-3]?\d)」 という風に書き、置換欄には 「\1年\2月\3日」 と書きます(ただしK2Editorで。miでは\1\2のところを$1$2と書く)。 もうこのふたつの例でおわかりになったんじゃないかな。グループ化したものは、置換欄で\1、\2、\3、\4という具合に順番で指定できるのです。 単純なシクミでしょ。しかし、このグループ化があるから、そしてそのグループ化した正規表現を置換欄で指定できるからこそ、正規業現を使うイミがあるってもんです。つまり、ここがもっともエッセンシャル。 グループ化は、置換欄のためだけではなく、他の使い方もあるのですが、それは次回・木曜日に。 |
この記事は
|
お読みになっての印象を5段階評価のボタンを選び「投票」ボタンをクリックしてください。 |
投票の集計 |
投票[ 7 ]人、平均面白度[ 4.4 ] ※「投票」は24時間以内に反映されます※ |
ご意見をお聞かせください |
|
←デジタル/シゴト/技術topへもどる | page top ↑ |
▲ゴト技top| 第11章 1| 2| 3| 4| 5| 6| 7| 8| 9| |
|ポット出版
|ず・ぼん全文記事|石田豊が使い倒すARENAメール術・補遺|ちんまん単語DB| |
|
|