行末の置換えについてNo.02101
むらやん さん 03/07/01 15:08
 
むらやんです。

β5を使用して、テキストの整形を行っていたときに気が付いた件で確認したいので
すが。

行頭に「"」を、挿入するために、検索へ^のみ、置換えに”のみを入力し
置換えを行ったところ、私の意図したとおり、行頭に”が挿入されたのですが
行末にも「",」を付加しなければならないので、検索へ$のみ、置換えに",を入力し
置き返したところ、無限に同じ行へ",を追加してしまいます。

JRE32とHMJREの動作を比べたところ、
行頭に関しては同じ動作
行末に関しては、
JRE32の場合、行末は置換えしない
HMJREの場合、無限に挿入してしまう
このような結果になっています。

ふと、選択範囲の置換えならうまくいくかと思い試したところ
検索のダイアログが出たまま、無限ループ状態になります。

置換えダイアログの項目は、大文字小文字の区別、正規表現および、置換え前に確認
をチェックしています。


Win2k SP3+IE6+秀丸4.00β5

[ ]
RE:02101 行末の置換えについてNo.02103
ひろ さん 03/07/01 17:03
 
 むらやんさん今日は、ひろです。
> 行末にも「",」を付加しなければならないので、検索へ$のみ、置換えに",を入力し
> 置き返したところ、無限に同じ行へ",を追加してしまいます。
 この β5 の動作に矛盾は有りませんし、不条理な仕様とは一概には言え無
いと思います。(根拠は後術します。) ただし「どの様な仕様にすると良い
か?」を問題として「使いやすい/実用的な仕様か?」と聞かれれば、直ちに
「否」と答えます。
 個人的には、「$」だけ仕様を変えると、同じ行毎の処理を表す「^」と矛盾
してしまいます。そこで、正規表現の行頭行末の意味で「^」「$」を使用した
場合は、検索/置換/全置換/前下候補に関わらず、行毎の処理になった方がよ
いと思います。ただ「^」の仕様も変えたとき問題になるのは、(特にマクロ
の) 互換性でしょう。←この仕様変更で動きが変わるマクロが実際に有るとも
思えませんが...。


 以下「β5 の動作に矛盾は無いし、不条理な仕様とは一概には言え無いと思
う」根拠です。長文ですので、読み飛ばして頂いて結構です。
 まず比較のために、検索文字列が「^.」で置換文字列が「」(空) で全置換
を行います。すると改行以外の全ての文字が削除されます。これは一見おかし
な動きの気がします。しかし、ここで例えば、
ABCD
と文章があった場合、[全置換] ではなく [下候補] で置換していく場合を考
えます。すると最初は「A」が消され、その結果文章は、
BCD
となりカーソル位置は B、つまり行頭のままです。その為、 [下候補] で
「B」「C」「D」と順に消されていきます。そして秀丸は、sed のように一行
一行処理をしているライン・エディタではなく、スクリーン・エディタなので、
直前にどの様な処理をしたに関わらず、現在の画面の状況に対して処理をする
という現在のこの仕様もありだと思います。更に [全置換] は [下候補] を繰
り返した動作と同じ、というのが秀丸の仕様です。こう考えると、最初の「改
行以外の全ての文字が消える」というのが、秀丸の仕様上は正しい動作という
ことになります。

 ここまでが前振りで、行末の話に戻ります。まず JRE32.DLL では「$」のみ
では行末にヒットしない、という仕様なので無視し、HmJre.dll の場合のみ考
えます。すると
ABCD
という文章に、検索文字列「$」置換文字列「",」としたとき、[下候補] を行
うと、
ABCD",
となりカーソル位置は「,」で行末のままです。ですからこの状態で更に [下
候補] とすれば、
ABCD",",
となります。そして [全置換] は [下候補] を再現するので、延々とこれを繰
り返す、ということになります。

[ ]
RE:02103 行末の置換えについてNo.02124
秀まるお さん 03/07/03 17:09
 
 JRE32.DLLでは「$」でうまくヒットしないようですが、BRegIf.dllを使った場
合はHMJRE.DLL同様に「$」で行末にヒットするようです。

 なので、しいてこの「$」にヒットする動作は現状のままとしたい所です。

 ただし、置換の時に無限ループに至ってしまうのは大変まずいと思います。そ
れについてはなんとか例外的な処理を追加して修正したいと思います。

[ ]
RE:02124 行末の置換えについてNo.02131
むらやん さん 03/07/04 15:56
 
秀まるおさん、こんにちは、むらやんです。

> なので、しいてこの「$」にヒットする動作は現状のままとしたい所です。

この置換えに関しては、\nを置き換えるという回避方法もあるので了解です。

> ただし、置換の時に無限ループに至ってしまうのは大変まずいと思います。そ
>れについてはなんとか例外的な処理を追加して修正したいと思います。

わかりました。
よろしくお願いします。


PS:上方検索で置換えすると意図した置換えが可能なことがわかりました。
ただ、範囲した範囲内のみで実行すると、選択エリアの先頭行と最終行が
置き換えられないのですが。

[ ]
RE:02131 行末の置換えについてNo.02132
秀まるお さん 03/07/04 17:03
 
> PS:上方検索で置換えすると意図した置換えが可能なことがわかりました。
> ただ、範囲した範囲内のみで実行すると、選択エリアの先頭行と最終行が
> 置き換えられないのですが。

 先頭行は大丈夫かと思いますけど、最終行は対象外になってしまうようで…。
ソースコードを見たら、範囲指定の最終部分にカーソル移動してから上検索して
いるようでして、それはそれでいじってしまうのが怖いような気がします。

 下手にいじってレベルダウンさせるのもなんだし、どっちにしても下方向の置
換で直る予定なので、このままとさせていただきます。

[ ]
RE:02132 行末の置換えについてNo.02152
むらやん さん 03/07/07 13:24
 
秀まるおさん、こんにちは、むらやんです。

$での置換えの件、β6で修正されていることを確認しました。

範囲選択も、正常に置換えできることを確認しました。

[ ]