|
秀丸担当さん & 秀まるおさん、こんにちは。
マクロで文字列変数に対するタグ付き正規表現置換 (後方参照) が簡単にできる方法
を用意していただけませんでしょうか。
いくつか私案を考えてみました。
----------------------------------------------------------------------
■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;
|
|