「全置換」の動作についてNo.00996
  さん 98/05/12 19:56
 
秀丸の「置換」で「全置換」を行う時、「正規表現を使用」にして検索文字列
として「行の先頭(^:カレット)」を使用していると、どうも置換の様子が変
です。

例えば "^." → ""(行の先頭の1文字を削除)という置換を行うと、テキスト
がすべて消えてしまいます。

この動作では、"^."を""に置換した時にその行の先頭にメタキャラクタ"^"がマッ
チしているにも関わらず、その次の置換で再度、既にマッチしている(つまり、
再度マッチするべきではない)同じ位置に"^"がマッチしてしまっていることに
なります。

意味がわかりづらいと思うので、例を挙げます。

行の先頭から「ABCDE」と書いてあるとします。これに対して "^A" → "" とい
う全置換を行うと「BCDE」になります。(正常)

ところが「ABCDE」に対して "^." → "" という全置換を行うと、文字列はなく
なってしまいます。(異常)

試しに「ABCDE」に対して "^(A|BC)" → "" という全置換を行うと、「DE」に
なってしまいます。つまり、もとの文字列には"^A"しかマッチしないはずなの
に、元の文字列ではマッチしないはずの"^BC"にも置換の過程でマッチしてしまっ
ているのです。

この動作では、同じ行の行頭が1回の操作で2回マッチしていることになりま
す。全置換では「置換後の文字列に対して再度置換を行う」という動作をして
いるようで、このようなことが発生します。

1回の「置換」を連続して行うのであれば置換後の文字列に対して再度置換し
て当然ですが、「全置換」では同じ位置に対して何度もマッチすることのない
ように対処するべきではないと思います。いかがでしょうか。

--
のぶ

[ ]
RE:00996 「全置換」の動作についてNo.01004
秀丸担当 さん 98/05/13 16:57
 
>秀丸の「置換」で「全置換」を行う時、「正規表現を使用」にして検索文字列
>として「行の先頭(^:カレット)」を使用していると、どうも置換の様子が変
>です。
>
>例えば "^." → ""(行の先頭の1文字を削除)という置換を行うと、テキスト
>がすべて消えてしまいます。

うーむ。なるほど。おっしゃっていることは良くわかります。
検討しておきます。


ちなみに

 --0A0B0++

というテキストに対して、"(0A0|0B0)"→""で置換するとき、
一回ごとの置換と、全置換では動作が変わるべきでしょうか。
一回ごとの置換では、「--B0++」で置換終了し、
全置換では「--++」で置換終了するべき?

[ ]
RE:01004 「全置換」の動作についてNo.01009
  さん 98/05/13 23:18
 
>  --0A0B0++
> というテキストに対して、"(0A0|0B0)"→""で置換するとき、
> 一回ごとの置換と、全置換では動作が変わるべきでしょうか。
> 一回ごとの置換では、「--B0++」で置換終了し、
> 全置換では「--++」で置換終了するべき?

どちらの場合でも「--B0++」で終了するべきです。
1回ごとの置換は説明不要ですよね。

全置換では、まず元の文字列の中の「0A0」にマッチして置換、次は元の文字列
でこの文字以降(つまり「B0++」)に対してマッチする場所を探すことになり
ます。しかし「B0++」にはマッチしないのでここで置換終了。

--
のぶ <xxxxxxxx@trialsoftware.com>

[ ]
RE:01004 「全置換」の動作についてNo.01010
杉浦 まさき さん 98/05/14 00:36
 
ども、横から失礼します。
 杉浦 まさき です。

>ちなみに
> --0A0B0++
>というテキストに対して、"(0A0|0B0)"→""で置換するとき、

"(0A0|B0)"→"" の間違いではないでしょうか?

それはともかくとして、
 「1回毎の置換」か「全置換」か、ではなくて、
 "^" か "$" を含む置換は1論理行毎に1回だけ適用する、
 というルールの方がいいと思うんですけど…。
 #"$" の方は必要ないかもしれないですね(^^;。


[ ]
RE:01010 「全置換」の動作についてNo.01014
秀丸担当 さん 98/05/14 19:06
 
>>ちなみに
>> --0A0B0++
>>というテキストに対して、"(0A0|0B0)"→""で置換するとき、
>
>"(0A0|B0)"→"" の間違いではないでしょうか?

いや、この例は、0A0 と 0B0 の最初の最後の 0 が重なり合うので、
このようなときどうなるべきか、ということなので、(0A0|0B0)で
正しいです。

>それはともかくとして、
> 「1回毎の置換」か「全置換」か、ではなくて、
> "^" か "$" を含む置換は1論理行毎に1回だけ適用する、
> というルールの方がいいと思うんですけど…。
> #"$" の方は必要ないかもしれないですね(^^;。

うーん、これは、意見の分れそうな所ですが、どうでしょう?>のぶさん

ちなみに、試しにやってみたVC++のテキストエディタの置換は、
「一回ごと」と「全置換」で動作が違うようです。
(0A0|0B0)のほうは、...挙動不審です。(?)


[ ]
RE:01014 「全置換」の動作についてNo.01018
EMiCC さん 98/05/14 20:51
 

EMiCC です。横から口を挟んですいません。

私としては "--0A0B0++" を "(0A0|0B0)" → "" で置換するとき、
3バイト目からの "0A0" のマッチングで "--B0++" に変わり、次に残りの
"B" から検索を始めて、マッチングする文字列がないので結果的に "--B0++"
となるのが自然だと思うのですが。
(でも「検索の世界では "--++" のなるのが常識」だったらこちらの頭の方を
切り替えます)

>ちなみに、試しにやってみたVC++のテキストエディタの置換は、
>「一回ごと」と「全置換」で動作が違うようです。
できれば同じ動作にしてくれた方が混乱しないですむのですが。
根がアホなもので・・・σ(^_^;)

[ ]
RE:01014 「全置換」の動作についてNo.01019
  さん 98/05/14 22:08
 
> > 「1回毎の置換」か「全置換」か、ではなくて、
> > "^" か "$" を含む置換は1論理行毎に1回だけ適用する、
> > というルールの方がいいと思うんですけど…。
> > #"$" の方は必要ないかもしれないですね(^^;。
> うーん、これは、意見の分れそうな所ですが、どうでしょう?>のぶさん

「^」を1論理行ごとに1回だけ適用する、「$」も1論理行ごとに1回だけ適
用する、という意味ならば、ぼくが言っていたのと全く同じことを単に違う言
葉で言い換えているだけですので結果は同じです。

実装方法まで指定するつもりは全くありませんので、実装してくださるのなら
ばぜひとも楽な方法を選んでください。

ちなみに、ぼくは「1回毎の置換と全置換で処理を変えてくれ」とは主張して
いませんので誤解なきよう。

--
のぶ <xxxxxxxx@trialsoftware.com>

[ ]
RE:01018 「全置換」の動作についてNo.01022
  さん 98/05/14 22:22
 
> >ちなみに、試しにやってみたVC++のテキストエディタの置換は、
> >「一回ごと」と「全置換」で動作が違うようです。
> できれば同じ動作にしてくれた方が混乱しないですむのですが。

"^." → "" の置換で文字列が何もなくなってしまうほうが混乱しないですか。
予見しがたい動作だと思うのですが。

それと、用語そのものに混乱があるのですが、ここで問題にしている「動作」
とは「置換の『内部的な処理』(実装)」ではなく「置換の『結果』」です。
置換の実装そのものが異なっているかどうかは定かではありません。

--
のぶ <xxxxxxxx@trialsoftware.com>

[ ]
RE:01019 「全置換」の動作についてNo.01023
杉浦 まさき さん 98/05/15 02:25
 
ども、杉浦 まさき です。

>「^」を1論理行ごとに1回だけ適用する、「$」も1論理行ごとに1回だけ適
>用する、という意味ならば、ぼくが言っていたのと全く同じことを単に違う言
>葉で言い換えているだけですので結果は同じです。

これは僕がアホでした(^^;。
 僕は、「1回の置換の繰り返し」の場合にも "^"("$") は1論理行毎に
 1回だけ適用されるようにしてほしい、
 と考えてあのような発言をしましたが、
 色々考えるとこれはやはり仕様としては変(^^;ですね。
 というわけで、僕の要望は撤回します。

しかし、"^" を1論理行毎に1回だけ適用する置換は
 ぜひとも欲しいですm(_ _)m。>秀丸95担当様
 #現行のコマンドの動作を変えるか新規にコマンドを設けるかは
  実装者にお任せします。<また同じようなことを言ってますが(^^;。


[ ]
RE:01023 「全置換」の動作についてNo.01038
秀丸担当 さん 98/05/18 18:10
 
>しかし、"^" を1論理行毎に1回だけ適用する置換は
> ぜひとも欲しいですm(_ _)m。>秀丸95担当様
> #現行のコマンドの動作を変えるか新規にコマンドを設けるかは
>  実装者にお任せします。<また同じようなことを言ってますが(^^;。

まあなにはともあれ要望リストに入れておきます。

[ ]