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」
\xhh 任意の文字コード hh の文字 (16進数) 例えば「\x41」で、16進数の「41」、 10進数の「65」。 これは文字でいうと「A」です
\uhhhh 任意のユニコードで指定する文字
(16進数4桁固定)
\u79C0」で、「秀」という文字を示す。
16進数4桁までなので、コードポイントが、 0x10000を超える場合は、サロゲートペアで 表現する必要がある。
(U+2000B)は、
上位サロゲート \uD840
下位サロゲート \uDC0B
のように2文字文を使う表現になる。
\Uhhhhhhhh 任意のユニコードで指定する文字
(16進数8桁固定)
\U000079C0」で、「秀」という文字を示す。
(U+2000B)は、\U0002000B という 表現になる。(Ver.8.52)

試しに、以下のマクロを実行してみてください。
@ と @ の間の表示に注目してみてください。

//---- 「\」の扱いを調べるテストマクロ ---------------------
$str[1] = "\t";
$str[2] = "\n";
$str[3] = "\"";
$str[4] = "\\";
$str[5] = "\x41";
$str[6] = "\u79C0";
$str[7] = "\uD840\uDC0B";
$str[8] = "\U0002000B";
#i = 1;
while( $str[#i] != "" ) {

    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文字の文字列」になっています。 「\\」が、\という文字自身を表していますので、そうなりますね。
でも、正規表現による検索・置換をする場合には、これでよいのです。というか、このように表記しなければいけません。

なぜそうなるのかを説明するために、少し難しくなりますが秀丸エディタの内部動作を説明します。

秀丸エディタは正規表現による検索・置換をするために、HMJRE.DLLというプログラムを利用しています。 秀丸エディタはHMJRE.DLLに、検索文字列を渡します。 HMJRE.DLLは、渡された文字列を「解析」して、その中に「\nという2文字の文字列」が有った場合に、 それを「改行文字」だと「解釈」をします。
つまり、HMJRE.DLLに渡す文字列にも、マクロで表記するのと同様な「表記のきまり」があるということです。 だから、改行文字を検索させたい場合に、HMJRE.DLLに対しては「\nという2文字の文字列」を送ってあげる必要があって、 そのためには秀丸エディタのマクロ文では「\nという2文字の文字列」を記述してあげればよいことになっています。

というわけで、searchdown 文の引数として「\nという2文字の文字列」を記述してあげればよいので、 "\\n"という書き方になるのです。

上記のマクロを見て、「あれっ、改行って確か「\n」だから、「searchdown "\n",regular;」じゃないの。 試しに動かしたら、ちゃんと検索したぞー」とおっしゃる方もおられると思います。
これは、HMJRE.DLLが一応「改行文字そのもの」を送られてきた場合にも対応しているから動作しています。 が、これは一般的な表記ではないので、複雑な文字列になると検索できない場合があります。 というわけで、"\\n"と書くようにしましょう。

この表記法は、改行だけに限らず、\を使う表記すべてに当てはまります。 ということで、たとえばタブ文字を検索したい場合は

searchdown "\\t", regular;

となりますし、\ という1文字を(正規表現中で)検索したいときには

searchdown "\\\\", regular;

となるわけですねヾ(^^;

# このように\を重ねて書かねばならないのはマクロ内だけです。正規表現による検索でもダイアログで普通に行う分には\は1個でよいです。
慣れてくると逆に混乱することがあるので、蛇足ですが(^^;)。

では、正規表現のマクロ記述は何でも\を重ねて書けばよいかというと、ダブルクォーテーションマーク(" )だけは異なります。

searchdown "\"", regular;

が正解です。ダブルクォーテーションマークは制御文字でなく普通の文字なので、\" でダブルクォーテーションマーク1文字をHMJRE.DLLに渡せるからです。 あるいは、以下のようにして「\"という2文字の文字列」をHMJRE.DLLに渡しても動作します。

searchdown "\\\"", regular;

もし、マクロ内で正規表現がうまく動かない場合は、使用する正規表現を message文で表示してみてください。 表示される内容が、HMJRE.DLLに渡される文字列になるので、実際にどのような文字列が渡されているのか確認出来ます。


目次に戻る