\記号の扱い方がダイアログとマクロで異なNo.19037
ironman さん 05/03/26 19:10
 
置換ダイアログとマクロを使う場合とでは\記号の扱い方が
異なるようで仕組みが理解できません。
<やりたいこと>
元の文字列にネットワーク上のコンピュータとフォルダをあらわす\記号を追加したい。
<例>
元の文字列     img01234
置換後の文字列   \\Server\Shared\img01234.jpg

<a.マクロを置換ダイアログを使う場合>
  検索(S):^img[0-9][5]\f
  置換(E):\\\\Server\\Shared\\\0.jpg
<b.マクロを使う場合>
replaceall "^img[0-9]{5}\\f", "\\\\\\\\Server\\\\Shared\\\\\\0.jpg",
         nocasesense,regular;
一つの\記号を追加するために4つの\記号を並べないといけない。
したがってServerの前に二つの\記号がほしいので合計8つの\記号を記述している。
ダイアログを使う場合と同様に
replaceall "^img[0-9]{5}\\f", "\\\\Server\\Shared\\\0.jpg",
         nocasesense,regular;
とすると次のような置換になってしまう。
\ServerSharedimg01234.jpg

なぜこうなるのか教えてください。

[ ]
RE:19037 \記号の扱い方がダイアログとマNo.19038
Iranoan さん 05/03/26 19:25
 
 ironman さん今日は、Iranoan です。
 念の為お断りしておくと、開発者とは何の関わりも無い単なる一ユーザです。
> <a.マクロを置換ダイアログを使う場合>
>   検索(S):^img[0-9][5]\f
>   置換(E):\\\\Server\\Shared\\\0.jpg
> <b.マクロを使う場合>
> replaceall "^img[0-9]{5}\\f", "\\\\\\\\Server\\\\Shared\\\\\\0.jpg",
>          nocasesense,regular;
> 一つの\記号を追加するために4つの\記号を並べないといけない。
> したがってServerの前に二つの\記号がほしいので合計8つの\記号を記述している。
> ダイアログを使う場合と同様に
> replaceall "^img[0-9]{5}\\f", "\\\\Server\\Shared\\\0.jpg",
>          nocasesense,regular;
> とすると次のような置換になってしまう。
> \ServerSharedimg01234.jpg
>
> なぜこうなるのか教えてください。
 端的に言えば、マクロでも「\」がエスケープ・キャラクタだからです。詳
細は、「秀丸エディタマクロ(入門用)ヘルプ」(html.hilight) の「マクロの
概要(入門用) エスケープシーケンスについて」を御覧ください。

[ ]
RE:19038 \記号の扱い方がダイアログとマNo.19039
ironman さん 05/03/26 20:31
 
Iranoanさんこんばんは。よく似たハンドル名ですね。わたしは
ironman(アイアイマン鉄人です)

> 端的に言えば、マクロでも「\」がエスケープ・キャラクタだからです。詳
>細は、「秀丸エディタマクロ(入門用)ヘルプ」(html.hilight) の「マクロの
>概要(入門用) エスケープシーケンスについて」を御覧ください。

エスケープシーケンスということは分かるのです。" は \" とするのと同じよう
に、\\とするわけですね。
しかしダイアログでは\\,マクロでは\\\\と個数が異なるのが理解できないですね。
根本的な前提知識が欠落しているのでしょうか?

[ ]
RE:19039 \記号の扱い方がダイアログとマNo.19040
h-tom さん 05/03/26 22:02
 

h-tom です。

>エスケープシーケンスということは分かるのです。" は \" とするのと同じよう
>に、\\とするわけですね。
>しかしダイアログでは\\,マクロでは\\\\と個数が異なるのが理解できないですね。
>根本的な前提知識が欠落しているのでしょうか?

マクロは"\\\\"という文字列がある場合、"\\"と解釈し秀丸に渡します。
秀丸は"\\"という文字列を渡されると、"\"と解釈します。

秀丸に"\\"と解釈させるには、マクロから"\\\\"を渡す必要があります。
"\\\\"とマクロに解釈させるには"\\\\\\\\"とマクロに記述する必要があります。

つまり、マクロ自体が文字列を解釈する時にエスケープシーケンスを認識するって
事です。
message文を使えばマクロが文字列をどの様に解釈しているかがわかりますよ。
 message "\\\\Server\\Shared\\\0.jpg";

[ ]
RE:19039 \記号の扱い方がダイアログとマNo.19041
アルビレオ さん 05/03/26 22:05
 
秀丸ユーザーのアルビレオです。

>エスケープシーケンスということは分かるのです。" は \" とするのと同じよう
>に、\\とするわけですね。
>しかしダイアログでは\\,マクロでは\\\\と個数が異なるのが理解できないですね。
>根本的な前提知識が欠落しているのでしょうか?

まず「マクロ文字列定数」が\をエスケープ文字として扱い、そして検索/置換コ
マンドの正規表現も\をエスケープ文字として扱うという2段構えになっている
ためです。
マクロで " などを書くためにエスケープシーケンスは必要だし、それとは別に
正規表現で . や * という文字を検索するにはエスケープシーケンスが必要です。

○ピリオドを検索
$s = "\\.";
message $s;// 「\.」と表示される
searchdown $s,regular;// 「.」を検索する
を試してみれば理解できるのではないでしょうか。

[ ]
RE:19041 \記号の扱い方がダイアログとマNo.19042
ironman さん 05/03/27 13:37
 
h-tomさん アルビレオさん

例示まで記述していただきありがとうございます。

なるほど、秀丸とマクロは別の世界(二段構え)
でそれぞれに\のエスケープシーケンスが
必要ということですね。
よく分かりました。

message命令をうまく使えば、vbのdebugのような
検証ができるのですね。
すこしマクロが身近になりました。

[ ]