文字列変数に対するタグ付き正規表現置換No.08317
IKKI さん 14/06/22 01:29
 
秀丸担当さん & 秀まるおさん、こんにちは。

マクロで文字列変数に対するタグ付き正規表現置換 (後方参照) が簡単にできる方法
を用意していただけませんでしょうか。

いくつか私案を考えてみました。
----------------------------------------------------------------------
■A案 Hmjre.dll の ReplaceRegular 関数を拡張する
イメージ:
 $s = dllfuncstr("ReplaceRegular", "「(.*)」", "「あ」", #offset, "『\\1』",
 3);
利点: 仕様変更量が最小
欠点: 置換処理が秀丸エディタ本体と Hmjre の両方に存在することになり、動作不
一致などの問題が将来起こるかも

■B案 置換処理を HmFilter.hmf に追い出す
イメージ:
 $s = filter("", "Replace", "/「(.*)」/『\\1』/i", "「あ」");
利点: 文字列変数に対する単語の検索やあいまい検索も同じインターフェイスで将来
実装できそう
欠点: 検索文字列・置換文字列・オプションを1個の文字列にエンコードして渡さな
ければならない。区切り文字をエスケープするとか面倒

■C案 文字列置換関数を秀丸エディタ側に追加する
イメージ:
 $s = gsub("「あ」", "「(.*)」", "『\\1』", #flags, #offset);
利点: 秀丸エディタ内の既存の置換処理を呼ぶだけ。単語の検索やあいまい検索も無
理なく可能
欠点: なし (?)
----------------------------------------------------------------------

現状では、文字列変数に対するタグ付き正規表現置換は末尾のようなサブルーチンで
実現していますが、これを Unicode に対応させようとしてサロゲートペアとか考え
始めたところで「これはマクロがやるべき仕事なのか??」という疑問が頭をもたげま
した。
文字列置換関数がひとつあれば、マクロ内で必要な文字列処理のかなりの部分が簡単
に書けるようになります。
ご検討いただければ幸いです。


SubstB: // 正規表現置換 (後方参照可)
 // $$1 = 対象文字列
 // $$2 = 検索パターン
 // $$3 = 置換パターン
 // ##4 = 大文字小文字の区別
 $$f = leftstr("FindRegularNoCaseSense", 11 + (##4 == 0) * 11);
 $$s = $$1;
 while (true) {
  ##p = dllfunc($$f, $$2, $$s, 0);
  if (##p < 0) break;
  $$t = "";
  $$u = $$3;
  while (true) {
   ##q = strstr($$u, "\\") + 1;
   if (##q <= 0) break;
   $$t = $$t + leftstr($$u, ##q - 1);
   ##e = ascii(midstr($$u, ##q, 8192)); // バックスラッシュの次の文字コード
   if (##e >= '1' && ##e <= '9') $$t = $$t + midstr($$s, dllfunc("GetLastMat
chTagPosition", val(char(##e))), dllfunc("GetLastMatchTagLength", val(char(#
#e))));
   else if (##e == '\\') $$t = $$t + "\\";
   else if (##e == 'n')  $$t = $$t + "\n";
   else if (##e == 't')  $$t = $$t + "\t";
   else                  $$t = $$t + char(##e);
   $$u = midstr($$u, ##q + strlen(char(##e)), 8192);
  }
  $$r = $$r + leftstr($$s, ##p) + $$t + $$u;
  $$s = midstr($$s, ##p + dllfunc("GetLastMatchLength"), 8192);
 }
 if (##p == -2) message "正規表現のエラーです\n" + $$2;
 return $$r + $$s;

[ ]
RE:08317 文字列変数に対するタグ付き正規No.08318
h-tom さん 14/06/22 12:32
 

h-tom です。

>マクロで文字列変数に対するタグ付き正規表現置換 (後方参照) が簡単にできる方法
>を用意していただけませんでしょうか。

なんか、意図を読み違えているかもしれませんが、現状でもA案は可能ですよ?
hmjre.dllのマクロ用関数の説明にも、
>第4パラメータ(文字列型):検索でヒットした文字列を置換する用の文字列を
>                            指定します。秀丸エディタの置換と同様に\0〜\9
>                            のタグ付き正規表現も指定出来ます。
とありますし。
サロゲートペアとかは、確認していませんけど。

//サンプルのマクロ
debuginfo 1;
loaddll "hmjre.dll";
$taeget = "「あ」";
$s = dllfuncstr("ReplaceRegular", "「(.*)」", $taeget, 0, "『\\1』", 2);
debuginfo $taeget + " --> " + $s;
endmacro;

//デバッガの出力
「あ」 --> 『あ』

[ ]
RE:08318 文字列変数に対するタグ付き正規No.08319
IKKI さん 14/06/22 13:00
 
h-tom さん、こんにちは。

>なんか、意図を読み違えているかもしれませんが、現状でもA案は可能ですよ?
あ、ほんとだ…。
ご指摘ありがとうございました。これができれば OK です。
# なぜ不可能と思い込んでいたのだろう…?

秀丸担当さん & 秀まるおさん、大変失礼いたしました。
このスレッド全体を撤回します。

[ ]