VZユーザーのための,VWXによる正規表現利用のてびき
初出:nifty:FGALDC/MES/13/09142〜 (2002/06/18〜2002/07/21)
タグ付き正規表現で記憶された文字列を呼び出して使えるタイミングは,置換文字列設定時に限りません。検索文字列の中でも出現順に記憶されていますので, 以下のような書き方も可能です。
\([0-9]+\)/\1
この文字列を設定して,下のサンプルのどこにマッチするか検証してみてください。
00087/00087 ABC01234 月光仮面 RE:コードネームは009/0011 (19) 99/01/12 18:46 00085へのコメント
『/』の両側に同じ数のある部分だけにマッチするでしょう。
なお,誤解してはならないのは,実際に出現したものを記憶するという点です。パターンではなくマッチした実際の文字列を記憶するのですから,パターンにマッチする別の文字列を期待するような書き方はできません。(ああ,甘かったワタシ)
誤り \([A-Z]\)\1\1\([0-9]\)\2\2\2\2
こんなことでniftyのIDにマッチするなんて勘違いしたわたしみたいなイカレポンチがひとりやふたりいるかもしれませんね。(いるといいけど(^_^;)
先の例だと,「AAA00000」,「BBB11111」や「ZZZ99999」のようにごく一定の文字列にしかマッチしません。そういう文字列を検索する目的があれば使えるかもしれませんが,そんなことめったにあるわけないですよね。
また,タグ付き正規表現による置換では,空文字列になる可能性のあるパターンを記憶させようとするのは止めておいた方がよいですね。空文字列を実体として記憶することはできないので,むりやり置き換えようとすると結果は不定になります。別の行でマッチして記憶された文字列に置き換えられたり,『\1』などがメタ文字としての意味を失ってそのまま出てきたりしてしまいます。
【結果は不定】^\(.*\)$ → \1
この例は,各行頭に引用符を付けるつもりだったのですが,空行にもマッチしてしまって結果が不定になるため,うまくいかない場合もあります。
それから忘れてはならないのが,正規表現は最長一致であるという点です。一般的なUNIXツールのようにメモリをふんだんに使えるような環境では問題にならないかもしれませんが,VWXではおそらく記憶できる文字数に制限があるせいなのか,最悪の場合ハングアップしてしまいますね。したがって,桁折り整形されていないような文書では,先のような行全体にマッチするような正規表現は避けた方がよいでしょう。
かく言うわたし,HTMLの見出しの階層を変えようと思ってタグ付き正規表現をつかったところ,妙ちくりんに長い見出しがあってハングさせたことがあります。そうそう,見出しと言えば,やはり階層を変えようと思って下位の階層をひとつ上の階層にしたんですね。結果は・・・うふふふ,さて,どうなったでしょうか。想像してみてください。正規表現に限らず,一括置換の前にはまず文書を保存,ですね。