200個近いhtml文書の書式を変更する時にはテキスト変換ソフトのお世話にならないととてもやっていられないのだが、その際に何行にもまたがる長い部分をマッチさせようとすると途端にスキップされる。どうも3行以上のマッチングというのは無理な様で、それだけ長い部分を相手にしようとしたら一旦改行コード(\r\n)を消去してから(つまり全体を1行にしてから)置換えなり削除なりをしなければならなかったのだが、これをやるとその後またタグの後に改行コードを挟み込んでやる必要があり、しかもその式が結構面倒臭いので極力手を出したくなかったのである。html文書では通常改行コードは無視されるので、個人のやり易いように整形して構わないのだが、例えばウチの場合は
- <p>の後は改行2個
- インライン要素のタグの後には改行は使わない
- <ul>の中はタブ一個分空ける
等の暗黙の了解というのがある。一度改行コードを全部取り除いた後にこれらのルールに則って再構成する式を立てるのが難しいのでついつい複数行にまたがるような大規模のマッチングを使う作業はやりたくなかったのだ。
しかし「検索CGI設置」でも少し触れたがtitle要素に何を書くかという問題について色々考えた結果「unlimited blue text archive:(記事タイトル)」という体裁を採ろうと思い立ったので、複数行のマッチングに挑戦するべくテキスト変換ソフトを立ち上げたのである。俺の知っている記号で作れる置換え式は
検索文字列 <title>(.+?)</title>(.+?)<h2>(.+?)</h2> 置換文字列 <title>$1:$3</title>$2<h2>$3</h2>
と、こんな感じである。最初の行でtitleの文字列($1)とh2の文字列($3)、及びtitleからh2の間に書かれている部分($2)を取得し、次の行でtitleタグの中に$1と$3を併記するわけだが、他の部分は元通りにしておかなければならないのでtitleからh2の間の文字列とh2部分の文字列をそのまま書き出す訳である。エレガントかどうかは別として、論理的にこの式は俺の望みを叶えてくれる筈なのだが、残念な事にこの「titleからh2の間の文字列」というのがmeta要素やらなんやらがいっぱい詰まっていて複数行に渡っている為に、この式は実行されないのだ。なんとか複数行のマッチングが出来ないもんかとネットをざらっと漁ってみたら画期的な方法が書いてあった。それをメモ替わりにここ書いておこうと思う。とても簡単だ。
- 改行コード(\r\n)を任意の文字列に置き換える
- 目的の式を実行させる
- 最初に置き換えた任意の文字列を、再度改行コードに置き換える
賢い!っていうか、なんでこんな簡単な事を思いつかなかったのだろう。一旦改行コードは全消去されるのだが、後から復活出来るのである。そしてこの任意の文字列は「決して本文中に出てこないような文字列」でなくてはならない。もし本文中に出てくるような文字列を指定したら、その箇所も改行コードに置き換わってしまうからだ。自分の文章の癖を思い出してとりあえず「これはないだろう」と選んだ文字列は”ほたた”である。こんな文字列を打ち込んだ記憶は無い。試しに2行目までの式を実行させてみるとちゃんと複数行のマッチングが行われ(というかこの時点では既に複数行ではなくなっているのだが)遙か後方にあるh2の文字列を拾ってきてtitle要素に入れてくれたのである。
そしてこの時点ではhtml文書の改行コードはすべて”ほたた”に置き換わっており、200近いファイルの中のあらゆる要素が”ほたた”で締めくくられるという、ある種爽快な文章が並んでいたのだが、ひとしきり笑った後それらを改行コードに再置換して今回の作業は無事終了した。また書式に変更を加える時の為に、この先も文中に”ほたた”という文字列は入れないように気をつけよう……と思ったのだが、よくよく考えてみれば他のファイルはともかく、このページには”ほたた”という文字列が頻出している。次にこの手を使う時にはまた別の文字列を考えなければいけないのか。……しまったなぁ。