秀丸のマクロ内から、手軽に正規表現を利用するためのライブラリです。
loaddllを使っていないため
等といった利点があります。
正規表現を利用する人に欠かせない2つの関数だけを実装しました。
この2つさえあれば、通常の正規表現対策としては十分でしょう。
loaddllを使うタイプでは、マクロ実行中に秀丸ウィンドウが切り替わると、再度loaddllが必要になるなど、
細かなバグが入り込む余地が多く、気を使うデリケートな扱いを要求されるシーンもあります。
しかし、このライブラリは、そのような心配とは無縁です。
関数の実装をコピペして、使えばOKです。
/* ■マッチ成否と「( )キャプチャ」の捕捉の例。 主要なプログラミング言語の正規表現の記述に慣れている人であれば、感覚に近い記述のハズ。 「\が付くメタ文字」をエスケープするのを忘れないこと */ call HMRE_Match "ccあいうaaa333", "(あ)(.+?)\\b([a-z]+)(\\d+)$"; #ret = ##return; // 数値タイプで返ってくる if (#ret) { message("マッチした"); } else { message("マッチせず"); } // マッチのキャプチャ(括弧で囲んだマッチ部分)結果は「$HMRE_M」という名称の文字列配列に入る。 message($HMRE_M[0]); // → あいうaaa333 message($HMRE_M[1]); // → あ message($HMRE_M[2]); // → いう message($HMRE_M[3]); // → aaa message($HMRE_M[4]); // → 333 /* ■置き換えの例 後方参照などの$1$2などが使えるので、サクッと変形できるだろう。 iオプションにより、大文字小文字を無視出来る。 */ call HMRE_Replace "AAABBBCCC", "(\\w{3})(.+?)(c+)", "頭$3$2$1尻", "i"; $ret = $$return; // 文字列タイプで返ってくる message($ret); // → 頭CCCBBBAAA尻 endmacro;
上述のzipファイルをダウンロードして利用する代わりに、
下記ソースをご自身のマクロの下部にペーストしておくことでも関数を利用することができます。
endmacro; HMRE_Match: $$str_source = $$1; $$str_regexp = $$2; $$str_option = $$3; call HMRE_Clear_M; ##rgx_obj = createobject("VBScript.RegExp"); setpropstr ##rgx_obj, "Pattern", $$str_regexp; if (strstr($$str_option, "i") >= 0) { setpropnum ##rgx_obj, "IgnoreCase", 1; } else { setpropnum ##rgx_obj, "IgnoreCase", 0; } ##matchs_obj_list = member(##rgx_obj, "Execute", $$str_source); ##COM_LAST_HRESULT = 11; ##error_result = getresultex(##COM_LAST_HRESULT); if (##error_result != 0) { message("正規表現エラー:" + $$str_regexp); } ##matchs_cnt = member(##matchs_obj_list, "Count"); if (##matchs_cnt == 0) { releaseobject(##rgx_obj); return 0; } ##COLLECTION_OBJECT_REQUEST_NEXT = 0; ##COLLECTION_OBJECT_RELEASE_COMMAND = 3; ##match_obj = 0; while(1) { ##match_obj = getcollection(##matchs_obj_list, ##COLLECTION_OBJECT_REQUEST_NEXT); if ( ##match_obj == 0 ) { break; } ##sub_matches = member(##match_obj, "SubMatches"); ##sub_matches_cnt = member(##sub_matches, "Count"); ##sub_matches_ix = 0; while(##sub_matches_ix < ##sub_matches_cnt) { $$str_sub_match = member(##match_obj, "SubMatches", ##sub_matches_ix); $HMRE_M[##sub_matches_ix+1] = $$str_sub_match; ##sub_matches_ix = ##sub_matches_ix + 1; } #HMRE_M_ArrayLength = ##sub_matches_cnt + 1; $$match_value = member(##match_obj, "Value"); $HMRE_M[0] = $$match_value; } ##match_obj = getcollection( #matchs_obj_list, ##COLLECTION_OBJECT_RELEASE_COMMAND ); releaseobject(##rgx_obj); return 1; HMRE_Replace: $$str_source = $$1; $$str_regexp = $$2; $$str_replace = $$3; $$str_option = $$4; call HMRE_Clear_M; ##rgx_obj = createobject("VBScript.RegExp"); setpropstr ##rgx_obj, "Pattern", $$str_regexp; if (strstr($$str_option, "i") >= 0) { setpropnum ##rgx_obj, "IgnoreCase", 1; } else { setpropnum ##rgx_obj, "IgnoreCase", 0; } $$str_result = member(##rgx_obj, "Replace", $$str_source, $$str_replace); ##COM_LAST_HRESULT = 11; ##error_result = getresultex(##COM_LAST_HRESULT); if (##error_result != 0) { message("正規表現エラー:" + $$str_regexp); } releaseobject(##rgx_obj); return $$str_result; HMRE_Clear_M: ##array_cnt = #HMRE_M_ArrayLength; ##ix = 0; while(##ix < ##array_cnt) { $HMRE_M[##ix] = ""; ##ix = ##ix + 1; } #HMRE_M_ArrayLength = 0; return;
MITライセンスです。
秀丸のHMJRE.dllをloaddllしてマクロ内で正規表現を利用する方法は、こちらに掲載されています。