第III部〜秀丸マクロのいろはにほへと
|
●マクロ内での「\」や特殊文字の使い方
【0】まえがき 〜 「\」や特殊文字を表記するために 〜
【1】「\」の意味
【2】「\」の使用例
【3】正規表現で使用する場合
【0】まえがき 〜 「\」や特殊文字を表記するために 〜
秀丸マクロで文字列を書きたいときには、" " (ダブルクォーテーションマーク:二重引用符)でくくってテキストファイル上に書きます。
ということは、その二重引用符の間に、「二重引用符自体」とか「改行文字」とかを書きたいと思った場合に、どうすればよいでしょうか?
秀丸マクロの場合、これらはC言語と同様の書式を用いることで書き表すことができます。
具体的には、このような特殊文字は、半角の「\」と、その後ろに特定の文字を組み合わせることによって書き表す、という「きまり」になっています。逆にいうと、「\」の文字を書きたいときに、単に「\」と書くとよろしくない、ということになります。
以下では、これらの特殊文字や、「\」自体を表記したい時の書き方を簡単にまとめてあります。
【1】「\」の意味
「\」を使う場合として、次のものが挙げられます。
「\t」 : タブ (16進数の「09」、10進数の「9」) 「\n」 : 改行 (16進数の「0A」、10進数の「10」) 「\"」 :「"」自身 (16進数の「22」、10進数の「34」) 「\\」 :「\」自身 (16進数の「5C」、10進数の「92」) 「\x??」 : 任意の文字コード ?? の文字
(例えば「\x41」で、16進数の「41」、10進数の「65」。これは文字でいうと「A」です)試しに、以下のマクロを実行してみてください。
@ と @ の間の表示に注目してみてください。
//---- 「\」の扱いを調べるテストマクロ ---------------------
$str[1] = "\t";
$str[2] = "\n";
$str[3] = "\"";
$str[4] = "\\";
$str[5] = "\x41";#i = 1;
while( #i <= 5 ) {message "@" + $str[#i] + "@";}
#i = #i + 1;
endmacro;
//---- ここまで --------------------------------------------
【2】「\」の使用例
では、実際に「\」が出てくるマクロをいくつか書いてみましょう。
(a)ファイル「c:\test.txt」をオープンするマクロ
//---- ファイルをオープンするテストマクロ ------------------
openfile "c:\\test.txt";
endmacro;
//---- ここまで --------------------------------------------ファイル名に「\」という文字を使いたい訳ですから、「\」自身の文字を表すために「\\」と表記します。
(b)改行を挿入するマクロ
//---- 改行を挿入するテストマクロ --------------------------
insert "改行する文章\n改行した後の文章";
endmacro;
//---- ここまで --------------------------------------------改行を表現したい時は、「\n」でしたね。
(c)正規表現による改行検索を行うマクロ
実は、正規表現による検索・置換をする場合には、\ の使い方が一見変わっているように見えます。【3】の例をごらんください。
【3】正規表現で使用する場合
//---- 改行検索を行うテストマクロ -------------------
searchdown "\\n", regular;
endmacro;
//---- ここまで -------------------------------------この表記だと、二重引用符の中は、「改行文字」ではなく「\nという2文字の文字列」になっています。「\\」が、\という文字自身を表していますので、そうなりますね。
でも、正規表現による検索・置換をする場合には、これでよいのです。というか、このように表記しなければいけません。なぜそうなるのかを説明するために、少し難しくなりますが秀丸の内部動作を説明します。
秀丸は正規表現による検索・置換をするために、JRE32.DLLというプログラムを利用しています(16bit版はJRE.DLL)。秀丸はJRE32.DLLに、検索文字列を渡します。JRE32.DLLは、渡された文字列を「解析」して、その中に「\nという2文字の文字列」が有った場合に、それを「改行文字」だと「解釈」をします。
つまり、JRE32.DLLに渡す文字列にも、マクロで表記するのと同様な「表記のきまり」があるということです。だから、改行文字を検索させたい場合に、JRE32.DLLに対しては「\nという2文字の文字列」を送ってあげる必要があって、そのためには秀丸のマクロ文では「\nという2文字の文字列」を記述してあげればよいことになっています。というわけで、searchdown 文の引数として「\nという2文字の文字列」を記述してあげればよいので、"\\n" という書き方になるのです。
上記のマクロを見て、「あれっ、改行って確か「\n」だから、「searchdown "\n", regular;」じゃないの。試しに動かしたら、ちゃんと検索したぞー」とおっしゃる方もおられると思います。
これは、JRE32.DLLが一応「改行文字そのもの」を送られてきた場合にも一部対応しているから動作しています。が、これは一般的な表記ではないので、複雑な文字列になると検索できない場合があります。というわけで、"\\n" と書くようにしましょう。この表記法は、改行だけに限らず、\ を使う表記すべてに当てはまります。ということで、たとえばタブ文字を検索したい場合は
searchdown "\\t", regular; となりますし、\ という1文字を(正規表現中で)検索したいときには
searchdown "\\\\", regular; となるわけですねヾ(^^;
# このように\を重ねて書かねばならないのはマクロ内だけです。正規表現による検索でもダイアログで普通に行う分には\は1個でよいです。
慣れてくると逆に混乱することがあるので、蛇足ですが(^^;)。では、正規表現のマクロ記述は何でも\を重ねて書けばよいかというと、ダブルクォーテーションマーク( " )だけは異なります。
searchdown "\"", regular; が正解です。ダブルクォーテーションマークは制御文字でなく普通の文字なので、\" でダブルクォーテーションマーク1文字をJRE32.DLLに渡せるからです。あるいは、以下のようにして「\"という2文字の文字列」をJRE32.DLLに渡しても動作します。
searchdown "\\\"", regular;