タグつき正規表現の置換でおちます。No.04804
mosjin さん 00/01/28 01:13
 
どうも、秀丸エディタ ありがたく使わせてもらってます。

正規表現の置換で落ちるパターンが発生したので報告します。
現在作成中の自作マクロで使う置換パターンなので、
できれば対処お願いします。

-------------------------------------------------
条件:80桁表示、禁則・ワードラップあり。
検索文字:.\f *
置換文字:\0\nx

あああああああああああああああああああああああああああああああああああああ x
xxxxxxxxxxx ああああああ

置換文字列:↑上記のもの。(ワードラップで半角文字が追い出される)
置換開始位置:72カラム目。

使用環境:
    秀丸エディタ 3.01 Froat-Macto
    PC-98NX/WIndowsNT4.0+SP6
エラーメッセージ
    "0x????????"の命令が"0x????????"のメモリを参照しました。
    メモリがwrittenになることができませんでした。
その他:
    ワードラップなしでは再現せず。
    ワードラップで追い出した文字の置換に不具合?

[ ]
RE:04804 タグつき正規表現の置換でおちまNo.04805
ENCODINGSHIFTJIS さん 00/01/28 14:44
 
>
>正規表現の置換で落ちるパターンが発生したので報告します。
>現在作成中の自作マクロで使う置換パターンなので、
>できれば対処お願いします。
>
>-------------------------------------------------
>条件:80桁表示、禁則・ワードラップあり。
>検索文字:.\f *

正規表現の解釈では
任意の1文字 直後は 0個以上の半角空白連がある。
でよいですか?
したがって全文字にマッチして .x で1行になる。
少なくともデータ量は2倍になるが?

[ ]
RE:04804 タグつき正規表現の置換でおちまNo.04808
秀丸担当 さん 00/01/28 17:13
 
>正規表現の置換で落ちるパターンが発生したので報告します。
>現在作成中の自作マクロで使う置換パターンなので、
>できれば対処お願いします。

試してみたところ、再現しました。
バグのようなので調べておきます。

[ ]
RE:04804 タグつき正規表現の置換でおちまNo.04810
える さん 00/01/28 23:32
 
関係ないことでもありますが、

>エラーメッセージ
>    "0x????????"の命令が"0x????????"のメモリを参照しました。
>    メモリがwrittenになることができませんでした。

ここの値がわかれば、同じバージョンの実行ファイルと開発環境がある秀丸担当さん
はじめ開発サイドの方々はエラーをかなり明確に特定できます。

秀丸とは関係なく、どんなソフトの開発者でも知りたい情報ではあるんではないかと
思います。

ので、できればここの値をハッキリ書いておくと、問題が一発解決なんてこともあっ
てよいかもしれませんよ (^^;
この値を有効に使えるとは限りませんけどね

[ ]
RE:04805 タグつき正規表現の置換でおちまNo.04811
mosjin さん 00/01/28 23:52
 
>正規表現の解釈では
>任意の1文字 直後は 0個以上の半角空白連がある。
>でよいですか?
>したがって全文字にマッチして .x で1行になる。
>少なくともデータ量は2倍になるが?

うぉっ、そうですね。マズイぞ、パターン見なおさなきゃ。
.* → [^ ]*
にすれば意図に合うか……


>>   "0x????????"の命令が"0x????????"のメモリを参照しました。
>>   メモリがwrittenになることができませんでした。
> ここの値がわかれば、同じバージョンの実行ファイルと開発環境が
> ある秀丸担当さんはじめ開発サイドの方々はエラーをかなり明確に
>特定できます。

そうですね。
数字メモるのが面倒くさくって、記憶できるだけをしか書いてませんでした。
(肝心の秀丸が死んでて、
 鉛筆探してこなくちゃメモ取れなかったんですよ。)


[ ]
RE:04811 タグつき正規表現の置換でおちまNo.04815
ENCODINGSHIFTJIS さん 00/02/01 17:05
 
>.* → [^ ]*
>にすれば意図に合うか……
>
ますます?? 全体の意図不明
正規表現なんて直感的に解釈できない。

「空白で単語切り出し」なら
[^ ]\f +
\0\n
でしょうか? もっと正確なのは長いと思いますが?

[ ]
RE:04815 新たな問題が……No.04816
mosjin さん 00/02/02 11:23
 
返事遅くて済みません。旅行に行ってたもので……

>ますます?? 全体の意図不明
>正規表現なんて直感的に解釈できない。
>
>「空白で単語切り出し」なら
>[^ ]\f +
>\0\n
>でしょうか? もっと正確なのは長いと思いますが?

すみません、パターン“[^ ]\f *”と間違えて書いちゃいました(謝々)

一応、やりたいことから説明すると、文書整形マクロを作っていて、
『行末の空白を消して改行を挿入』がしたいのですが、
それを普通に delete と insert を使って行うと、元に戻す時、
二回かそれ以上の Undo が必要になりますよね?
で、置換を使って一回の編集動作(一発で Undo 可能)であるように見せかけようと
しているわけです。

検索パターン:.\f *
置換パターン:\0\nx

上記の検索パターンで空白のあとが“*”なのは、空白が無い場合も同じパターンで
対応するためです。で、最初、頭の文字を“.”ですませてあるのは、“abcd   ef
”のようなパターンがあった場合、あらかじめカーソルを“d”の位置までもってい
ってから、置換をかけるつもりだったから、空白はありえないと判断していたワケで
す。本当は安全のために“[^ ]\f *”の方がよいかな?
(置換パターンの“x”には、本当は次の行の行頭インデントの空白が入る)

説明わかりにくかったらごめんなさい。
人に説明するのって、すっごく苦手なんです……


……投稿まとめちゃって、お行儀悪いですが、
秀丸作者さま、新たな問題が――

-------------------------------------------------
条件:80桁表示、禁則・ワードラップあり。
検索文字:[^ ]\f *
置換文字:\0\nx

ああああxyああああああ

置換文字列:↑上記のもの。
置換開始位置:9 カラム目。

上記のパターンで置換をかけると、“y”が1文字、消えてしまいます。
意図としては、“[^ ]\f *”→“y”と検出して “\0\n”→“y\n”と置換させたつ
もりなのですが、“y”が消えます。

キャラクタパターンと \f の組み合わせによってタグ範囲の検出が失敗するのでしょ
うか?“[^ ]”が“.”だった時には、“y”消えなかったんですが……



[ ]
RE:04816 新たな問題が……No.04818
秀丸担当 さん 00/02/02 17:35
 
最初の問題である死ぬ問題は次のバージョンで直る予定です。

>……投稿まとめちゃって、お行儀悪いですが、
>秀丸作者さま、新たな問題が――
>
>-------------------------------------------------
>条件:80桁表示、禁則・ワードラップあり。
>検索文字:[^ ]\f *
>置換文字:\0\nx
>
>ああああxyああああああ
>
>置換文字列:↑上記のもの。
>置換開始位置:9 カラム目。
>
>上記のパターンで置換をかけると、“y”が1文字、消えてしまいます。
>意図としては、“[^ ]\f *”→“y”と検出して “\0\n”→“y\n”と置換させたつ
>もりなのですが、“y”が消えます。
>
>キャラクタパターンと \f の組み合わせによってタグ範囲の検出が失敗するのでし
>ょうか?“[^ ]”が“.”だった時には、“y”消えなかったんですが……

これは、確かに変ですね。
試しに" *"を検索してみると"ああああ"を一気に飛ばしてしまうのですが、
これが関係しているのかもしれません。
調べておきます。


[ ]
RE:04818 新たな問題が……No.04819
ENCODINGSHIFTJIS さん 00/02/02 18:14
 
>最初の問題である死ぬ問題は次のバージョンで直る予定です。
>

x の話はチョット置いときます。
行頭インデント量を難しく注文しないのなら、「自動インデントon設定」で
行ける場合があるから。ここの設定は?
・・・改行を入れた瞬間に前行のインデント量が引き継がれる。
でも、自動処理の結果を想定してマクロを書くのは面倒な場合もある。
first-indent と second-indent が違うようなとき、自分で計算しても
面倒なんだけど。

hidemaru が落ちる現象は再現しました、ワードラップ送り行で
残された(行末?行頭?)空白(複数可)への置換でしょうか?
カーソル位置が行末空白にあるとダメ。
行中でも1文字消えるのと[同じ原因]では、\f * で位置がズレた
置換しているのでは?
あxyあ でも y の後方に空白があると正常、\f * で空白0個
の時 \f が絡んで...

\f[^ ]\f *\f
\1\n\2z

あx  yあ
カーソルをx  y の間に置き直前の置換をすると y は \2 に入っている!
 * 0個の\2に \1 が食われてしまう。  

では、
AB\f[0-9]*\f *
0=\0\n1=\1\n2=\2\n3=\3\n
でやって見ました。

  AB1223FFFF
は \2 が \1 を1文字食べている。
  0=AB
1=122
2=3
3=
FFFF

  AB  FFFF
は正常?
  0=AB
1=
2=  
3=
FFFF

  ABFFFF

  0=AB
1=
2=
3=
FFFF


[^ ]\f[ ]*\f *
\1\n\2z

あああああ

文字あ が破壊される。そういえばHelp の例は皆 + 付きだ。
でも * はだめと明解な文では見えない。エラーメッセージも出ない。
わかりやすい文では言えないが*よくなさそうな事はわかった。

『行末の空白を消して改行を挿入』は
カーソル位置の後方の空白(もしあれば)は削除してから
改行挿入、 でしょうか?インデントの邪魔になるから。 
結果として行末になる空白を... でも同じ?

カーソル位置の後方空白を選択して、その選択範囲に insert "\nx";
する、複数行のマクロを書くのが安全でしょう。

オシマイ。


[ ]
RE:04819 新たな問題が……No.04842
ENCODINGSHIFTJIS さん 00/02/04 14:09
 
// 最初の発想に近いものならば。
//
right; // [^ ] のハズらしいから。
if(' '==code){left;replacedown " +","\n=",regular;}
else insert "\n=";
endmacro


// zdsj   l   zajflj sl;f z
//
// アンカーで動かない 正規表現 match できるといいな。
// \f を使わなくできる。そういえばsearch でmatch した範囲を
// 認識できたっけ。selected にはなってないからどうかな。
//


[ ]
RE:04842 新たな問題が……No.04854
秀丸担当 さん 00/02/04 18:23
 

むう、よく、わからないすが、最初の問題は、置換の問題ではなく、
貼り付けの問題でした。

貼り付け時に、禁則処理が働いて、
1.直前の行に文字付け足し(または句読点ぶら下げ)
2.直前の行に改行をぶらさげ
3.元の行に文字挿入
という3つのケースが重なるときに発生します。
次のバージョンで直ります。

[ ]
RE:04854 新たな問題が……No.04867
mosjin さん 00/02/07 12:47
 

> // 最初の発想に近いものならば。
> //
> right; // [^ ] のハズらしいから。
> if(' '==code){left;replacedown " +","\n=",regular;}
> else insert "\n=";
> endmacro

どうもです、いろいろと考えてくださり、ありがとうございます。
現状、“.\f *”のパターンでごまかして使ってます。
予め、空白以外にカーソル移動させているので、ミスヒットも無いですし。
(落ちるパターンに引っかかりそうな場合は、とりあえず手動で)
でも、上のパターンが一番安全かな?

--------

>むう、よく、わからないすが、最初の問題は、置換の問題ではなく、
>貼り付けの問題でした。
(中略)
>次のバージョンで直ります。

むぅぅ、確かによくわかりませんが……無事問題発覚した様で安心です。
よろしくおねがいします。

[ ]