VZユーザーのための,VWXによる正規表現利用のてびき
初出:nifty:FGALDC/MES/13/09142〜 (2002/06/18〜2002/07/21)
『
』は,位置を指定するメタキャラクタです。パターンの先頭に存在するときに意味を持ち,行の先頭にマッチします。ただし,あとで別の使い方も出てきますが,これも先頭に置く使い方になるので,とりあえず先頭に置いたときに意味を持つと覚えましょう。したがって,文字列中に検索文字列の一部として出てくる時に,わざわざ『\^』などど意味の打ち消しを行う必要はありません。さて,正規表現を使わなくても行頭の特定の文字を検索することは可能ですね。たとえば日本語の段落の最初はスペースがありますから,『\n 』を検索すれば段落をたどれるはずです。実際にやってみてください。
たいていは 『\n』 を前置することで対応できるでしょう。ところが『 』には,ひとつ芸当ができます。直前に改行がない行頭=文書頭でもマッチするということです。これは文書中でただの1箇所しかありませんが,非常に大きな意味を持っています。
行頭の『@』でカードの先頭を指示するSTK形式のデータがあります。このカードの枚数を数えてみましょう。VZの置換では,置換数がコマンドの返り値として戻ってきますので,この機能を利用しましょう。
RX[+, ;正規表現の使用宣言
#56 "^@" #m "@" #m "ay" ;同じ文字(列)で置き換え
RX], ;オプションは元に戻す
&m("%u",r) ;返り値(置換数)を表示
これを正規表現を使わないとすると,ステップが余計に必要です。
#56 "\n@" #m "\n@" #m "ay" ;同じ文字(列)で置き換え
r[, #M ;置換数と位置を保存
#^ #< ;文書頭の文字が…
r=(cd=='@')+r], r[, #U ;@なら加算して元の位置に戻る
&m("%u",r]) ;返り値(置換数)を表示
なお,MS-DOS以外の環境で作成されたテキストで,改行コードに『\l』(0Ah)や『\r』(0Dh)が使用されている場合,『 』で行頭と認識されませんので使用できません。疑わしい場合は,改行コードをすべて 『\n』(0D0Ah) に置き換えてからにしてください。
改行コードの統一は一定の手順に従わないと,行数が変化したり置換漏れを起こす可能性がありますので注意しましょう。上村さんの0D0A.defの利用をおすすめします。
余談ですが,VZは内部的にはファイルの先頭にも『\n』を付加しています。ファイル先頭のカーソル位置オフセットが2(cp==2)になるのはこのためです。