bregexp/bregif での複数行置換で…No.08955
杉浦 まさき さん 01/06/09 01:12
 
こんばんは、杉浦 まさき です。

jre32.dll を置き換える bregexp/bregif を用いた
複数行にまたがる置換で、
以下のような現象が発生したので報告させて頂きます。
#おそらく秀丸には罪はないと思われますが、
 切り分けが微妙なのでこちらで報告致しますm(_ _)m。

2行以上の改行のみの行を1行にまとめる
TAKA さん作のルーチンをテストしようとして、
以下のようなマクロを bregexp/bregif 環境下で実行したところ、
「invalid target parameter」というエラーメッセージが出て
置換が全く行われませんでした。
なお、純正の jre32.dll ではOKでした。
#↑というわけで秀丸側の問題ではないような気がしますが…??

//--------------------------------------//
newfile;
insert "\n\n\n\n\n\n";
gofileend;
replaceup "^\\n\\n+", "\n", regular;
while (result) {
    findup;
}
endmacro;
//--------------------------------------//


[ ]
RE:08955 bregexp/bregif での複数行置換No.08956
Arimac さん 01/06/09 02:29
 
>「invalid target parameter」というエラーメッセージが出て
>置換が全く行われませんでした。
 
bregexp.dllに長さ0の検索対象文字列を渡すと出るようです。
(通常は行末に\nがある)
 
秀丸側の動作としてはカーソル位置が[EOF]にある時、
通常は"[EOF]"という文字列を渡してきていますが、
"^\\n\\n+"を指定した場合は長さ0の文字列を渡して
きています。(恐らく"\\n"の有無)
 
さらに通常の、カーソル位置が[EOF]以外にある時の
検索では、[EOF]行では長さ0の文字列を渡して
きていますがこれに対してbregifがエラー(上記と同じ)
を返してもエラーとは扱わず通常のアンマッチ扱いに
なっています。(これは知ってたけど支障が無かった
のでそのままにしてた)
 
文字列"[EOF]"が渡ってくるのはいずれ修正される気が
する(^^;ので、[EOF]のみの行を表す長さ0の文字列
に対応しなければならないと思われますが、
bregifとしてはどうするべきか・・・(^^;
"^"はマッチしそうな気がするし、
"$"はマッチすべきかどうか良く分からないし、
"^A?"とかもされるだろうし・・・
 
#東京から戻ってきました(^^;
#でも月曜からまた出張(東京)(;_;)

[ ]
RE:08955 bregexp/bregif での複数行置換No.08965
Arimac さん 01/06/10 04:43
 
>「invalid target parameter」というエラーメッセージが出て
>置換が全く行われませんでした。

aaa
bbb
ccc[EOF]
というテキストで"c$"を検索した場合では
[EOF]の前のcにマッチしました。
この場合では秀丸は最後の行を"ccc\0"という
感じで"\n"なしで送ってきています。
 
ということでbregexp.dllに長さ0の検索対象文字列を
渡した時にこのエラーがでるのは変という感じが
してきました。
 
babaqさんに治してもらえるものなのでしょうかねぇ・・・

[ ]
RE:08956 bregexp/bregif での複数行置換No.08975
杉浦 まさき さん 01/06/10 23:52
 
Arimac さん、こんばんは。
杉浦 まさき です。

>>「invalid target parameter」というエラーメッセージが出て
>>置換が全く行われませんでした。
>bregexp.dllに長さ0の検索対象文字列を渡すと出るようです。
>(通常は行末に\nがある)

う〜ん、なぜこの場合長さ0の文字列が渡されるんでしょうね??
#しかも、その場合でも jre32.dll ではちゃんと置換されるのが
 さらに謎(^^;。

>文字列"[EOF]"が渡ってくるのはいずれ修正される気が
>する(^^;ので、[EOF]のみの行を表す長さ0の文字列
>に対応しなければならないと思われますが、
>bregifとしてはどうするべきか・・・(^^;

素直に(^^;オリジナルの jre32.dll の動作に従う、
というのはどうでしょうか?


[ ]
RE:08956 bregexp/bregif での複数行置換No.08984
秀丸担当 さん 01/06/11 17:20
 
>文字列"[EOF]"が渡ってくるのはいずれ修正される気が
>する(^^;ので、[EOF]のみの行を表す長さ0の文字列

[EOF]まで渡すのはいずれ修正しようと思います。

[ ]
RE:08975 bregexp/bregif での複数行置換No.08996
Arimac さん 01/06/12 12:48
 
>う〜ん、なぜこの場合長さ0の文字列が渡されるんでしょうね??
秀丸エディタではnul(\0)ストップで文字列が渡されますが、
bregexp.dllには文字列と文字列長を渡します。
通常の行は最後に"\n"があるので最低でも1バイトの
長さがありますが、EOF行では"\n"がないので他に行に文字がない
と0バイトということになります。
また、そのパターンがマッチするかどうかは正規表現ルーチン側の
判断なので、秀丸エディタは対象となる行を全て送ってくるので
EOF行もそれに含まれることになります。

>#しかも、その場合でも jre32.dll ではちゃんと置換されるのが
> さらに謎(^^;。
確認はしていませんが、jre32.dllではEOF行についても最後に"\n"が
あるかのような動作をしているのでょう。(ただし、"\n"にはマッチ
しない)

>素直に(^^;オリジナルの jre32.dll の動作に従う、
>というのはどうでしょうか?
現在、月末(予定)まで出張中(開発環境が無い&期限直前の
修羅場状態(^^;)なのでしばらく確認できません<(_ _)>

[ ]
RE:08996 bregexp/bregif での複数行置換No.09025
杉浦 まさき さん 01/06/12 23:44
 
Arimac さん、こんばんは。
杉浦 まさき です。

>>う〜ん、なぜこの場合長さ0の文字列が渡されるんでしょうね??
>秀丸エディタではnul(\0)ストップで文字列が渡されますが、
>bregexp.dllには文字列と文字列長を渡します。
>通常の行は最後に"\n"があるので最低でも1バイトの
>長さがありますが、EOF行では"\n"がないので他に行に文字がない
>と0バイトということになります。

言葉足らずですみませんでしたm(_ _)m。
「\n が検索対象文字列に入っているのに…」をつけるべきでした。

で、前方・後方に関わらず、
「カーソル位置から"後方の" \n の数+1行」を渡す仕様&
[EOF] 行の後ろにはもちろんそれ以上行はないので nul を渡している、
という風に考えれば納得いきますが…あってますでしょうか?>担当様

>現在、月末(予定)まで出張中(開発環境が無い&期限直前の
>修羅場状態(^^;)なのでしばらく確認できません<(_ _)>

ご苦労様です。ご自愛しつつ(^^;頑張って下さいm(_ _)m。


[ ]
RE:09025 bregexp/bregif での複数行置換No.09026
Arimac さん 01/06/13 01:08
 
>で、前方・後方に関わらず、
>「カーソル位置から"後方の" \n の数+1行」を渡す仕様&
>[EOF] 行の後ろにはもちろんそれ以上行はないので nul を渡している、
>という風に考えれば納得いきますが…あってますでしょうか?>担当様

よく考えてみれば[EOF]から上に向かって検索しているわけ
だから[EOF]行を渡しちゃいけないような気がしてきました・・・(^^;
(とはいっても[EOF]行を渡されてエラーになるのは問題ですが)

[ ]
RE:09025 bregexp/bregif での複数行置換No.09064
Arimac さん 01/06/15 00:24
 
EOFのみの行には何もマッチさせなくて良い
という感じがしてきたのでbregifだけで
対応できそうです。
でも直せるのは早くて来月ということに・・・m(_ _)m

[ ]
RE:09025 bregexp/bregif での複数行置換No.09180
Arimac さん 01/07/01 16:12
 
家に帰ってきたので修正してみました。
うまく行ってるようです。
秀丸エディタのマクロライブラリに登録しましたが、
公開されるのは時間が掛かるかもしれないので
私のHPからダウンロードする方が早いかも(^^;
p.s.
 また月曜から出張です・・・(;_;)

[ ]