gettext で 空文字を取得No.09915
おすぎ さん 22/08/05 11:48
 
いつもお世話になっています。

次のマクロを
 #num = 1;
 while(1){
 searchdown "(?\\1)>(.*?)<", regular;
 $word[#num] = gettext(seltopx, seltopy, selendx, selendy);
 escape;
 #num = #num + 1;
 }

次の文字列に適用すると
 >あ<
 ><
 >う<

結果は次の通りです。
$word[1] = "あ";
$word[2] = "あ";
$word[3] = "う";

$word[2] = "" とする方法はあるでしょうか?

[ ]
RE:09915 gettext で 空文字を取得No.09916
Iranoan さん 22/08/05 12:38
 
おすぎさんこんにちは Iranoan です
>  #num = 1;
>  while(1){
>  searchdown "(?\\1)>(.*?)<", regular;
>  $word[#num] = gettext(seltopx, seltopy, selendx, selendy);
>  escape;
>  #num = #num + 1;
>  }
>
> 次の文字列に適用すると
>  >あ<
>  ><
>  >う<
>
> 結果は次の通りです。
> $word[1] = "あ";
> $word[2] = "あ";
> $word[3] = "う";
これは一致部分がないときでも sel〜 キーワードの更新すべき案件の気もしますね
しか変更すると、互換性などどのような問題が起きるやら

> $word[2] = "" とする方法はあるでしょうか?
実機で確認していませんが、
>  searchdown "(?\\1)>(.*?)<", regular;

  searchdown "(?<=>).*?(?=<)", regular;
として前方/後方一致を使うとなにか変化は有りますか?
これもだめなら
>  searchdown "(?\\1)>(.*?)<", regular;
>  $word[#num] = gettext(seltopx, seltopy, selendx, selendy);

  searchdown ">.*?<", regular;
  $word[#num] = gettext(seltopx + 1, seltopy, selendx - 1, selendy);
といったように、正規表現の部分一致を使うのではなく、マクロ関数側で一部を取り
出してはどうでしょう?

あと書き込まれたマクロは while 文の終了条件がありませんよね…
また古いバージョンを使い続けなければならない理由がなければ、設定依存をなくす
ために sel〜 より found〜 を使ったほうが良いでしょう

[ ]
RE:09916 gettext で 空文字を取得No.09917
おすぎ さん 22/08/05 13:48
 
Iranoan さん

ありがとうございます。

@前方/後方一致を使う場合
  searchdown "(?<=>).*?(?=<)", regular;

Aマクロ関数側で一部を取り出す場合
  searchdown ">.*?<", regular;
  $word[#num] = gettext(seltopx + 1, seltopy, selendx - 1, selendy);

@、Aとも結果は次の通りでした。、
 $word[1] = "あ";
 $word[2] = "あ";
 $word[3] = "あ";
 $word[4] = "あ";
 $word[5] = "あ";

どちらも、検索カーソルが下流に進まないようです。
検索ダイアログを開いて上記2つの正規表現で検索すると、
サクサクと検索が進むのですが、マクロにすると進みません。
なぜ ???


ところで、selendx よりも foundendx を使った方が良いのはなぜでしょうか?
selendx   は V8.66以降
foundendx は V4.10以降 のようです。
foundendx を使う利点を教えて下さい。

[ ]
RE:09917 gettext で 空文字を取得No.09918
igus さん 22/08/05 14:24
 
みなさん、こんにちは。
selでなくfoundを使うとうまくいくようです。

gofiletop;#num = 1;
while(1){
searchdown "(?<=>)(.*?)(?=<)", regular;
if(!result)break;
$word[#num]=gettext(foundtopx,foundtopy,foundendx,foundendy);
message $word[#num];escape;#num=#num+1;}

[ ]
RE:09918 gettext で 空文字を取得No.09919
おすぎ さん 22/08/05 14:48
 
igus さん

仰るとおり selでなくfoundを使うと、
次の両方に対してうまくいきました。

 searchdown "(?<=>)(.*?)(?=<)", regular;
 searchdown "(?\\1)>(.*?)<", regular;

ありがとうございました。

seltopx よりも foundtopx の方が良いってこと、でしょうか?

[ ]
RE:09919 gettext で 空文字を取得No.09920
Iranoan さん 22/08/05 15:29
 
おすぎさんこんにちは Iranoan です
> ところで、selendx よりも foundendx を使った方が良いのはなぜでしょうか?
> selendx   は V8.66以降
についてですが、Ver.8.66 以降なのは [] が使用可能か否かであって sel〜 はもっ
と昔、found〜より前から有ります

foundendx などの利点ですが、まず selendx などは検索に限らず範囲選択を示す
キーワードです
そのため検索と組み合わせて使っている場合、動作環境で「検索での表示」が「範囲
選択」になっている必要があります
それに対して、found〜 検索にヒットし範囲そのものなので、上の設定に依存しません

PS どうやら sel〜 範囲選択を示すので、選択範囲がなければ更新されない仕様とい
うことでしょうね

また実機 (Ver.9.17) で試しましたが、次の sel〜 を使ったマクロでも空文字の取
得ができましたよ
setcompatiblemode 0x00020200; //動作環境に関わりなく「検索での表示」を「範囲
選択」扱いで動かす
#num = 0;
searchdown ">.*?<", regular;
while(result){
  $word[#num] = gettext(seltopx + 1, seltopy, selendx - 1, selendy);
  #num = #num + 1;
  finddown;
}
menuarray $word, #num;

[ ]
RE:09920 gettext で 空文字を取得No.09921
おすぎ さん 22/08/05 17:01
 
Iranoan さん

foundendx系 について詳しい説明をありがとうございました。
次回から検索ヒット用語を取得するときには foundend系を使うようにします。

こちらのマクロテストが間違っていたようでスミマセンでした。

助けていただきまして、ありがとうございました。

[ ]