単語の全置換No.03178
ひろ さん 02/06/08 23:49
 
 皆さん今日は、ひろです。
 単純に考えるなら、単語の置換なら、
replaceallfast "word","Word",word;
で良いのですが、設定によっては word0, 1word は置換されません。また設
定にかかわらず、word_, _word は置換されません。この仕様はプログラミン
グの時は良いのですが、通常の文章では、感覚と一致しません。
 そこで末尾のマクロなら問題ないと思うのですが、何か抜けていればご指
摘を頂けないでしょうか? なお replaceallfast を使った方が簡単なのです
が、ダイアログが表示させたくないので、finddown2 を使っています。
//---------------------- word replace -------------------------------
call WordReplace "word", "Word";
endmacro;

WordReplace:
  disabledraw;
  call WordReplace2 $$1, $$2, 5;
  call WordReplace2 "[^A-Za-z]\\f" + $$1 + "$", "\\0" + $$2, 20;
  call WordReplace2 "^" + $$1 + "\\f[^A-Za-z]", $$2 + "\\1", 20;
  call WordReplace2 "[^A-Za-z]\\f" + $$1 + "\\f[^A-Za-z]",
    "\\0" + $$2 + "\\2", 20;
  enabledraw;
  return;

WordReplace2:
  gofiletop;
  setsearch $$1,##3;
  setreplace $$2;
  while( 1 ){
    finddown2;
    if( !result )break;
  }
  return;

[ ]
RE:03178 単語の全置換No.03179
ENCODINGSHIFTJIS さん 02/06/10 10:37
 
手操作では、正規表現置換
\b[0-9_]*\fword\f[0-9_]*\b
\0WORD\2
例題は 処理できているようです。
(Baba DLL ですが)
0-9 などが1桁なら ? のほうがいいでしょう

[ ]
RE:03179 単語の全置換No.03180
ひろ さん 02/06/10 13:05
 
 ENCODINGSHIFTJIS さん今日は、ひろです。
 ご意見有り難うございます。
> (Baba DLL ですが)
 JRE32.dll では駄目でした(;_;)。

[ ]
RE:03180 単語の全置換No.03181
ENCODINGSHIFTJIS さん 02/06/10 15:35
 
チョット揚げ足とり

// word  1word   word2   _word  word_   A_word_word_B  

「中置き」 が 連続すると、両方はできない。
拡張正規表現でも 「先読み」「後読み」の「幅0マッチ」が
できないと、「中置き」の連続は、1度に処理できません。

「前置き」「中置き」「後置き」の場合分けで正解と
思います。


[ ]
RE:03181 単語の全置換No.03182
ひろ さん 02/06/10 18:01
 
 ENCODINGSHIFTJIS さん今日は、ひろです。
> // word  1word   word2   _word  word_   A_word_word_B
>
> 「中置き」 が 連続すると、両方はできない。
 度々の確認有り難うございます。
 確かに下方検索だから出来ませんね。次のようにすることで回避できました。
 ##もう漏れはないかな。

WordReplace2:
  gofileend;
  setsearch $$1,##3;
  setreplace $$2;
  while( 1 ){
    findup2;
    if( !result )break;
  }
  return;

[ ]
RE:03182 単語の全置換No.03184
encodingshiftjis さん 02/06/11 22:47
 
// 想定の句はよくわかりませんが

call WordReplace2 "word", "Word";
endmacro;

WordReplace2:  // 1パス処理へのこだわりで、やってみました。
// gofiletop;
 setsearch "(\\b|[0-9_])" + $$1 + "([0-9_]|\\b)",16; //regular
        finddown2;
 while( result ){
              $$match=gettext(seltopx,seltopy,selendx,selendy);
 right strstr($$match,$$1);  // 置換は自前でします
beginsel;right strlen($$1);  // 拡張正規表現を秀丸置換は
               insert $$2;   // 想定してないから, 心配性かな?
 left;  finddown2;    // カーソル後退、「先読み」が使えない対策です
 }
 return;

// wwword  word  00word  word99   A_word_word_word_B

[ ]
RE:03184 単語の全置換No.03185
ひろ さん 02/06/12 00:19
 
 encodingshiftjis さん今日は、ひろです。
 度々有り難うございます。
> WordReplace2:  // 1パス処理へのこだわりで、やってみました。
 確かに一度でできれば、それに越したことはないですね。

>  setsearch "(\\b|[0-9_])" + $$1 + "([0-9_]|\\b)",16; //regular
 ただ JRE32.DLL では、こういったときに \b は使えないのか
> // wwword  word  00word  word99   A_word_word_word_B

// wwword  word  00word  word99   A_Word_Word_Word_B
となってしまいます(;_;)。

[ ]
RE:03185 単語の全置換No.03186
ENCODINGSHIFTJIS さん 02/06/12 11:57
 
> ただ JRE32.DLL では、こういったときに \b は使えないのか

\b (単語境界) は「先読み」「後読み」の変形ですから、
マッチ範囲の外は非単語文字という。行頭行末にもなるのが便利です

JRE32.DLL でも少し試したが ([xxx]|[^xxx]|$)  の 論理和グループ化
での マッチ範囲の ? 現象で断念しました。
複雑な時は gettext の結果が よくわからなかった。

場合分けで、安定動作のほうが安心です。

[ ]