Hidemaru Q and A

第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;


目次に戻る