正規表現の挙動がおかしいNo.16294
bon108 さん 03/12/29 19:48
 
秀丸V4.04(HMJRE.DLL V1.01)で
^;;@
を検索or置換すると
;;@;;@;;@
のように連続したパターン全てに(つまり行頭以外も)マッチします。

[ ]
RE:16294 正規表現の挙動がおかしいNo.16298
encodingshiftjis さん 03/12/29 21:52
 
秀丸V4.10 β7では正常です

[ ]
RE:16298 正規表現の挙動がおかしいNo.16309
秀まるお2 さん 03/12/30 16:39
 
 HmJre.dllのバグだと思いますが、うちの会社の営業時間がそろそろ終わりで
して、原因究明は年越しになりそうです。

 とりあえず、encodingshiftjisさんの話によると、最新の秀丸(これに付属の
HmJreはVersion1.05)では起きないそうなので、それで回避して欲しい所です。

[ ]
RE:16309 正規表現の挙動がおかしいNo.16333
秀まるお2 さん 04/01/03 23:56
 
 HmJre.dllのV1.01で試した限りでも、行頭の部分にしかヒットしませんでした。

 置換の場合とのことなので、試しに、"^;;@"を""に置換する(削除する)形で
やってみたら、連続するパターンのすべてにマッチして、最終的に空行が発生す
る形になってしまいました。ただし、この動作は別にHmJreがどうこういう問題
じゃなくて、秀丸エディタの置換動作がそのようになっているせいみたいです。

 もし、"^;;@"を""に置換する話だとしたら、これはこれで仕様のような気がし
ます。

 秀丸V3.19にて、"^A"を""に置換するテストもしてみましたが、同じ動作(連
続した"AAAAAAAAA"がすべて削除される)となってしまいました。

[ ]
RE:16298 正規表現の挙動がおかしいNo.16341
encodingshiftjis さん 04/01/04 16:05
 
行頭置換の繰り返しを避けるには、
タグ付き正規表現で末尾を保存するなど

検索パターン
^a\f.*
置換パターン
\1

aは行頭のパターン
.* は以降の任意パターン

[ ]
RE:16333 正規表現の挙動がおかしいNo.16343
bon108 さん 04/01/04 23:32
 
検索については、再度確認してみたところ、行頭にしかマッチしませんね。早とちり
だったようです。
置換については、仕様だとすると、例えば、
aaaaaを「^a」→「aa」と置換した場合、無限に置換が繰り返されるはずですが、実
際は1回しか置換されず一貫していません。
とすれば、一度しか置換されない仕様に統一して欲しいです。

[ ]
RE:16343 正規表現の挙動がおかしいNo.16344
アルビレオ さん 04/01/05 00:00
 
秀丸ユーザーのアルビレオです。

>aaaaaを「^a」→「aa」と置換した場合、無限に置換が繰り返されるはずですが、

そういう考え方もあるかもしれませんが、そうはなりません。
テキスト中の検索位置を"|"であらわすと

最初の状態が以下のようになっているとします。
|aaa

"^a"→""を1回実行すると
|aa
となり、検索位置は行頭にあるため、また"^a"にマッチします。

"^a"→"aa"を1回実行すると
aa|aa
となり、次の検索位置は行頭にはないので"^a"にはマッチしません。

sedなどの"s/^a//g"では行単位で一括置換するのに対して、秀丸の「全置換」は
「1回の置換」を連続実行しているために出てくる違いです。
これはあくまで「違い」であって「不具合」と呼べるようなものではないし、変
更すると既存のマクロが正しく動作しなくなる可能性も高いので、たぶんこのま
まになるでしょう。

[ ]
RE:16343 正規表現の挙動がおかしいNo.16345
秀まるお2 さん 04/01/05 00:02
 
 一応、置換した結果の文字列をさらに置換することが無いような処理はしてる
はずです。置換が無限に繰り返されるようなことがあれば、それはそれでバグと
して修正します。

 今回の"^A"を""に置換するようなケースは、無限に置換が繰り返されるケース
とは別です。

 今までにもいくつか正規表現での置換がおかしいケースが見つかってはいまし
て、ソースコードの中にはいくつか例外的な処理が入ってはいるようです。なの
で、今回のケースも例外的に対処した方がいいのかもしれません。

 秀丸担当と相談して、今回のケースを例外扱いとするかどうか、検討してみま
す。

 具体的に例外処理するとしたら、検索対象文字列として"^"による行頭一致指
定をした場合に限り、1行につき1回しか置換しないような処理をすることにな
ると思います。

------------
 (そういう例外処理が必要かどうかについてご意見ありましたら、それはそれ
でご意見ください)

[ ]
RE:16343 正規表現の挙動がおかしいNo.16346
ENCODINGSHIFTJIS さん 04/01/05 11:15
 
>置換については、仕様だとすると、例えば、
>aaaaaを「^a」→「aa」と置換した場合、無限に置換が繰り返されるはずですが、実
>際は1回しか置換されず一貫していません。
>とすれば、一度しか置換されない仕様に統一して欲しいです。

置換後のカーソル位置の違いです。
a → ""  ではカーソルが新データの行頭に残るので
再マッチします。
(旧データ上にもカーソルがあるとすると違いますが)

a → aa では ^aa| となって新データの行頭にはいません。
---------------
置換のパターンを削除部分に注目する形から
残す部分に注目する形に変更すると、回避できます。
テキスト処理の「直感に反する部分」が頭を出したのでしょう。

[ ]
RE:16346 正規表現の挙動がおかしいNo.16347
ENCODINGSHIFTJIS さん 04/01/05 11:21
 
;;@ を タブに全置換
逆インデント
タブを;;@ に全置換

しても、結果を得られます。

[ ]
RE:16345 正規表現の挙動がおかしいNo.16348
Arimac さん 04/01/05 11:38
 
改版履歴を見ると
> 2003.07.11 :Ver4.00β8
> ・「^」を「x」に置換してカーソル移動するバグ修正
というのがあるようなので連続置換する場合に限るとかする方が良いかも(^^;
(上記修正時の顛末は調べてませんが・・・)

[ ]
RE:16348 正規表現の挙動がおかしいNo.16349
秀まるお2 さん 04/01/05 13:00
 
 V4.00β8でのバグ修正は、また別件だそうです。V3.13の時に何かいじったそ
うです。

 つまり、V3.12以下だと、bon108さんの期待通りに動作していたらしいです。
(ちゃんと確認した訳ではないけども)

 V3.13以前の状態に戻して他のユーザー様から苦情が来ても仕方がないので、
以下のように対処します。

 1.条件:検索文字列の先頭が"^"で、正規表現での置換をする時で、しかも
   置き換える文字列が""である場合で、「全置換」の場合に限り。
 2.置換した位置と同じ位置をもう一度置換しようとした場合は、置換しな
   いことにする。

 秀丸V4.10βの方で、適当な次期に対応します。

[ ]