置換が無限に行われる。No.04309
fun さん 04/02/24 13:56
 
秀丸担当さん こんにちは、funです。

以下のマクロ test.mac を、以下の文章に対して実行すると置換が無限に実
行されます。

//----------- test.mac
    replaceall "/\*" , "/\*\\n" , regular, nocasesense;
//----------- test.mac ここまで


//----------- 文章 ここから

/*

//----------- ここまで


こちらの環境は、Windows2000SP4、IE6、秀丸V4.10 β16です。
HMJRE.dll V1.07

[ ]
RE:04309 置換が無限に行われる。No.04310
tnobu2 さん 04/02/24 14:30
 
>秀丸担当さん こんにちは、funです。
>
>以下のマクロ test.mac を、以下の文章に対して実行すると置換が無限に実
>行されます。
>
>//----------- test.mac
>    replaceall "/\*" , "/\*\\n" , regular, nocasesense;
>//----------- test.mac ここまで

"/*"の後に改行を入れるマクロでしょうか?
それならばこう書けばちゃんと動きます。

   replaceall "/\\*" , "/*\\n" , regular, nocasesense;


[ ]
RE:04310 置換が無限に行われる。No.04311
fun さん 04/02/24 14:41
 
 funです。

>"/*"の後に改行を入れるマクロでしょうか?
>それならばこう書けばちゃんと動きます。
>
>   replaceall "/\\*" , "/*\\n" , regular, nocasesense;

指摘ありがとうございます。
教えてもらった書き方でちゃんと出来ました。

お騒がせしました。

[ ]
RE:04311 置換が無限に行われる。No.04316
Iranoan さん 04/02/24 15:39
 
 秀丸担当さん、fun さん今日は、Iranoan です。
> >"/*"の後に改行を入れるマクロでしょうか?
> >それならばこう書けばちゃんと動きます。
> >
> >   replaceall "/\\*" , "/*\\n" , regular, nocasesense;
>
> 指摘ありがとうございます。
> 教えてもらった書き方でちゃんと出来ました。
>
> お騒がせしました。
 えっと、そういう問題だったんですね....。

 「私は無限に置換されるのは良くないのでは無いか?」という投稿だと思っ
ていました。今回は検索文字列が「/*」で、検索に引っかかる文字列の最短長
が 0 なので、置換後のカーソル位置が変化しないので、正しい動作といえる
かもしれません。
 しかし検索にヒットした文字列長が 0 でもヒットしたと考えるなら、
・ファイル終端での「下候補」
・ファイル先頭での「上候補」
でヒットしてもおかしくない/すべきか? と思案してしまいます。
 「正規表現で、文字列の最短長が 0 になる記述を禁止するか、ヒットした
文字列長が 0 なら、ヒットしたとは扱わない」等の対処をした方が良いと思
います。少なくとも無限に置換できてしまうのは、良くないのではないでしょ
うか?

 因みに Ver.4.06+Jre32.dll で、メニューから
検索文字列:/*
置換文字列:/*\n
も同じでした。

[ ]
RE:04316 置換が無限に行われる。No.04318
Arimac さん 04/02/24 16:21
 
> 「正規表現で、文字列の最短長が 0 になる記述を禁止するか、ヒットした
>文字列長が 0 なら、ヒットしたとは扱わない」等の対処をした方が良いと思
>います。

それだと
検索文字列:^
置換文字列://
が出来なくなるので困るなぁ

[ ]
RE:04318 置換が無限に行われる。No.04328
Iranoan さん 04/02/24 17:17
 
 Arimacさん今日は、Iranoan です。
> それだと
> 検索文字列:^
> 置換文字列://
> が出来なくなるので困るなぁ
 実はこれと $ については、投稿前に削ってしまいました(^^;。
 私もできなくなるのは困りますが、
検索文字列:^.
置換文字列:

検索文字列:^//
置換文字列:
といった置換の為に、これらは行毎の処理ということで、既に例外処理を行っ
ていると想像しています。

[ ]
RE:04328 置換が無限に行われる。No.04351
秀丸担当 さん 04/02/25 12:31
 

置換は、検索のようにカーソル位置の次の文字から検索を開始していないので、
下候補で無限になるのは仕方が無いです。

>といった置換の為に、これらは行毎の処理ということで、既に例外処理を行っ
>ていると想像しています。

^があるときの例外的な処理は、全置換のときに入っています。
これと同じように、全置換のときにヒット文字数が0のときは例外的な処理を行
うことも考えられますが、副作用が無いか心配です。
これまでにも、こういった例外的な処理で、こっちを立てればあったが立たず状
態になることがよくあった気がします。

ファイルの先頭で上候補と、ファイルの最後で下候補ができないのは仕様とさせ
ていただきます。

[ ]
RE:04351 置換が無限に行われる。No.04356
Iranoan さん 04/02/25 16:54
 
 秀丸担当さん今日は、Iranoan です。
> >といった置換の為に、これらは行毎の処理ということで、既に例外処理を行っ
> >ていると想像しています。
>
> ^があるときの例外的な処理は、全置換のときに入っています。
 全置換の時だけなんですね。

> これと同じように、全置換のときにヒット文字数が0のときは例外的な処理を行
> うことも考えられますが、副作用が無いか心配です。
 解りました。

[ ]