秀丸エディタ・マクロ用 正規表現関数 COM版

  • 概要

    秀丸のマクロ内から、手軽に正規表現を利用するためのライブラリです。
    loaddllを使っていないため

    • 取り回しがしやすい
    • 複雑なマクロとくっ付け易い

    等といった利点があります。

    正規表現を利用する人に欠かせない2つの関数だけを実装しました。

    • BOOL HMRE_Match("対象文字列", "部分マッチ正規表現", "オプション");

      正規表現を使ったマッチ成否の結果をえる関数(括弧部分の文字列の抽出も兼ねる)
    • string HMRE_Replace("対象文字列", "部分マッチ正規表現", "置き換え後文字列", "オプション");

      正規表現を使った文字列置き換え関数 です。

    この2つさえあれば、通常の正規表現対策としては十分でしょう。

    使いどころ

    loaddllを使うタイプでは、マクロ実行中に秀丸ウィンドウが切り替わると、再度loaddllが必要になるなど、
    細かなバグが入り込む余地が多く、気を使うデリケートな扱いを要求されるシーンもあります。
    しかし、このライブラリは、そのような心配とは無縁です。
    関数の実装をコピペして、使えばOKです。

  • ダウンロード

    DOWNLOAD ⇒ HmRegexpCom.zipファイル。ver 1.00
    └更新日 2017/12/13

    動作環境

    • 秀丸 ver8.00以上。

    使い方のソース例

    /*
    ■マッチ成否と「( )キャプチャ」の捕捉の例。
      主要なプログラミング言語の正規表現の記述に慣れている人であれば、感覚に近い記述のハズ。
      「\が付くメタ文字」をエスケープするのを忘れないこと
    */
    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してマクロ内で正規表現を利用する方法は、こちらに掲載されています。