\についてNo.21337
ゆふ さん 06/05/24 22:34
 
とても初歩的なこととは思いますが、分からないので教えて下さい

 replaceallfast "●" , "\n" , regular;
 replaceallfast "●" , "\\n" , regular;

上記のようなマクロを作成して実行したらどちらも正常に動きます。

正規表現の時の改行は\\nとつづけないといけないんでしょうか?
それとも\nのみでいいのでしょうか?

すみませんがよろしくお願いします。

[ ]
RE:21337 \についてNo.21339
Iranoan さん 06/05/25 00:46
 
 ゆふさん今日は、Iranoan です。
 念の為お断りしておくと、開発者とは何の関わりも無い単なる一ユーザです。
> とても初歩的なこととは思いますが、分からないので教えて下さい
 内容は初歩的なこととはいえないと思うので、安心してください。

>  replaceallfast "●" , "\n" , regular;
>  replaceallfast "●" , "\\n" , regular;
>
> 上記のようなマクロを作成して実行したらどちらも正常に動きます。
>
> 正規表現の時の改行は\\nとつづけないといけないんでしょうか?
> それとも\nのみでいいのでしょうか?
 答えは、どちらも良い、となります。

 以下蛇足ですので、どうしてそうなるか興味があれは御覧ください。
 これを理解するには、次のこと大きく 2 つに分けて考えれば、納得頂ける
と思います。

 まず前提として、上記のマクロを書かれているので、
(1) 正規表現で改行を表すには、\n とする
(2) マクロで改行を表すには \n とする
(3) マクロと正規表現の両方でエスケープ文字は \ である
はご存じだと思います。

 次にマクロでこれが処理される場合、どの様な順序で行われるか考えます。
(a) マクロが読み込まれ、秀丸の内部コードに変換される
    A この時、\ に続く文字は、必要に応じて変換される。ただし続く文字が
      特別な意味がなければ、\ が削除されるだけ
(b) 変換時に文法エラーが無ければ、ここのコマンドが実行される
(c) 上記のマクロは、置換で正規表現を使っているので、検索/置換文字列は
    A と同じ処理が行われる

 最後に実際に、
(A) replaceallfast "●" , "\n" , regular;
(B) replaceallfast "●" , "\\n" , regular;
に付いて、どうなるか考えます。
 (A) は (1) により (a) の時点で改行コード [0A] に変換されます。このあ
と [0A] には \ [5C] が含まれていないので、(c) の段階でも改行コード
[0A] のまま処理されるだけです。
 次に (B) を考えると、(1) の段階で \\n は (a) により最初の \\ だけ変
換され \n [5C 6E]、(c) の段階で改行コード [0A] となり、最終的には同じ
になります。
(ここでは文字コードによる 16 進表記を [] で挟んで表しています。)

[ ]
RE:21339 \についてNo.21343
秀丸担当 さん 06/05/25 14:06
 

>  replaceallfast "●" , "\n" , regular;
>  replaceallfast "●" , "\\n" , regular;

これについては、Iranoanさんも言われている通り、どちらでも動きます。
"\n"はマクロの解釈で改行になります。
"\\n"はマクロの解釈で「\n」という文字列として解釈され、さらに正規表現の
解釈で改行になります。

[ ]
RE:21343 \についてNo.21347
ゆふ さん 06/05/25 20:51
 
Iranoanさん秀丸担当さんありがとうございました。

今まで作成したマクロが間違っていたかも!?ってアセってたんですが、Iranoanさ
んにとても詳しく回答していただき、本当に助かりました!

ありがとうございます。



[ ]