マクロからのdllfunc呼び出し(Ver5.34対応版)
 HmJre.dllには、秀丸マクロからloaddllしてdllfuncで呼び出せる関数があります。
 ユニコード文字(Shift-JIS範囲外の時)を扱う場合および「エンコードの種類=外国語」の場合のためのおまじないとして、
#dummy = dllfunc("SetUnicodeIndexAutoConvert", 1);
#dummy = dllfunc("NotifyEncode", encode);
 が必要になります。詳しくはユニコード文字を扱う時の注意およびエンコードの種類が外国語の場合の注意を参照ください。
Fuzzy_OptionDialog関数
 この関数は、あいまい検索の設定ダイアログボックスを表示します。

パラメータ1(数値型):
 ダイアログボックスの親となるウィンドウのハンドルを指定します。普通はhidemaruhandle(0)を指定してください。


返り値:
 OKボタンを押して設定を完了した場合は1、キャンセルボタンを押した場合は0を返します。




JreGetVersion関数
 この関数はHmJre.dllのバージョン番号を返します。dllfunc関数で呼び出し可能です。パラメータはありません。

返り値:
 返り値は、下位の2バイトのみが有効で、上位ワードにはでたらめな値が入ってしまいます。以下のようにしてバージョン番号を取得してください。

メジャーバージョン番号 = (dllfunc("JreGetVersion") & 0xFF00) / 256;
マイナーバージョン番号 = (dllfunc("JreGetVersion") & 0xF0) / 16 * 10 + (dllfunc("JreGetVersion") & 0xF);




FindRegular, FindRegularNoCaseSense関数(V1.50以降から)
 FindRegular関数は、特定の文字列から特定の正規表現パターンのマッチングをして、ヒットした場合はその位置を返します。
第1パラメータ(文字列型):検索したい正規表現文字列を指定します。
第2パラメータ(文字列型):検索対象の文字列を指定します。
第3パラメータ(数値型):検索を開始する桁位置を指定します。先頭から検索したい場合は0を指定します。
返り値(数値型):ヒットした場合は検索対象文字列先頭からの桁位置(0以上の値)を返します。ヒットしなかった場合は-1を返します。正規表現の解釈その他でエラーが起きた場合は-2を返します。
 FindRegularNoCaseSense関数は、大文字/小文字を区別しないで検索する以外は、FindRegular関数とまったく同じです。
#n = dllfunc( "FindRegular", "pattern", "target-string", 0 );
if( #n >= 0 ) {
    message "ヒットしました。";
}


FindGeneral関数(V1.97以降から)
 FindGeneral関数は、「大文字/小文字の区別」、「正規表現」、「あいまい検索」の3つをそれぞれについてON/OFFをパラメータで指定して検索を実行します。
第1パラメータ(数値型):大文字/小文字の区別を指定します。1なら区別あり、0なら無しです。
第2パラメータ(数値型):正規表現のON/OFFを指定します。1なら正規表現あり、0なら普通の文字列検索です。
第3パラメータ(数値型):あいまい検索のON/OFFを指定します。1ならあいまい検索、0なら無しです。
第4パラメータ(文字列型):検索したい文字列を指定します。
第5パラメータ(文字列型):検索対象の文字列を指定します。
第6パラメータ(数値型):検索を開始する桁位置を指定します。先頭から検索したい場合は0を指定します。
返り値(数値型):ヒットした場合は検索対象文字列先頭からの桁位置(0以上の値)を返します。ヒットしなかった場合は-1を返します。正規表現の解釈その他でエラーが起きた場合は-2を返します。
#n = dllfunc( "FindGeneral", 0,0,1, "b", "abc", 0 );
if( #n >= 0 ) {
    message "ヒットしました。";
}


GetLastMatchLength関数(V1.50以降から)
 FindRegularまたはFindRegularNoCaseSense関数またはFindGeneral関数で0以上の値が返った場合に、マッチした文字列の長さを返します。返り値は数値型で、パラメータはありません。
補足:
FindRegularなどの関数呼び出しの後でReplaceRegularなどの置換系の関数を呼び出すと、それによってこの関数の返す値が壊れます。
FindRegularなどの関数呼び出しで負の数が返った場合(ヒットしなかった場合)には、GetLastMatchLength関数の返り値は-1になります。


GetLastMatchTagPosition, GetLastMatchTagLength関数(V1.90以降から)
 GetLastMatchTagPosition関数は、FindRegularまたはFindRegularNoCase関数またはFindGeneral関数がヒットした場合で、さらに、その関数呼び出しパラメータで指定した検索パターンにタグ付き正規表現が含まれている場合に、そのタグの位置を返します。パラメータには、タグ文字の番号である1〜9が指定出来ます。返される位置は、検索文字列の先頭からの位置であって、ヒットした位置からの相対位置ではありません。
 GetLastMatchTagLength関数は、タグの長さを返します。パラメータには1〜9の番号が指定出来ます。
補足:
FindRegularなどの関数呼び出しの後でReplaceRegularなどの置換系の関数を呼び出すと、それによってGetLastMatchTagPositionなどの関数の返す値が壊れ、返り値は不定となります。
FindRegularなどの関数呼び出しで負の数が返った場合(ヒットしなかった場合)にも、GetLastMatchTagPositionなどの関数の返り値は不定となります。
ヒットしたタグが無かった場合はどちらの関数も-1を返します。
loaddll "hmjre.dll";
$target = "xxxあああいいいうううxxx";
$pattern = "(あ+)(い+)(う+)";
#n = dllfunc("FindRegular", $pattern, $target, 0);
if( #n >= 0 ) {
	#len = dllfunc("GetLastMatchLength");
	#tag1 = dllfunc("GetLastMatchTagPosition", 1);
	#tag1len = dllfunc("GetLastMatchTagLength", 1);
	#tag2 = dllfunc("GetLastMatchTagPosition", 2);
	#tag2len = dllfunc("GetLastMatchTagLength", 2);
	#tag3 = dllfunc("GetLastMatchTagPosition", 3);
	#tag3len = dllfunc("GetLastMatchTagLength", 3);
	#tag4 = dllfunc("GetLastMatchTagPosition", 4);
	#tag4len = dllfunc("GetLastMatchTagLength", 4);
	message "hit=(" + str(#n) +  "," + str(#len) + ")\n" +
			"tag1 = (" + str(#tag1) +  "," + str(#tag1len) + ")\n" +
			"tag2 = (" + str(#tag2) +  "," + str(#tag2len) + ")\n" +
			"tag3 = (" + str(#tag3) +  "," + str(#tag3len) + ")\n" +
			"tag4 = (" + str(#tag4) +  "," + str(#tag4len) + ")";
} else {
	message "ヒットしません。";
}


EnvChanged関数(V1.71以降から)
 EnvChanged関数は、あいまい検索関係の設定をレジストリから読み込み直しします。マクロからあいまい検索の設定をいじりたい場合には、まずはHmJre.dll用のレジストリを適当に書き換えてからこの関数を呼んでください。
#n = dllfunc("EnvChanged");


ReplaceRegular, ReplaceRegularNoCaseSense関数(V1.98以降から)
 ReplaceRegular関数は、特定の文字列から特定の正規表現パターンのマッチングをして、ヒットした場合はパラメータに従った置換を実行し、その置換した結果の文字列を返します。
 ヒットしなかった場合や正規表現のコンパイルエラーの場合は""を返します。
第1パラメータ(文字列型):検索したい正規表現文字列を指定します。
第2パラメータ(文字列型):検索対象の文字列を指定します。
第3パラメータ(数値型):検索を開始する桁位置を指定します。先頭から検索したい場合は0を指定します。
第4パラメータ(文字列型):検索でヒットした文字列を置換する用の文字列を指定します。
\0〜\9および\g{1}〜\g{15}のタグ付き正規表現も指定出来ます。
変換モジュールを通す用の、\(タグ番号,関数名)のような構文は使えません。
第5パラメータ(数値型):0を指定すると、最初にヒットした文字列だけを置換します。
1を指定すると、ヒットする文字列すべてを置換します。
2を指定すると、1を指定したのと同じく全置換しますが、もしも何も置換出来なかった場合にはパラメータ2で指定された文字列をそのまま返す動作となります。
第5パラメータは省略可能で、省略した場合は0を指定した扱いになります。
返り値(文字列型):検索がうまくヒットした場合は置換が実行され、その結果の文字列が返ります。ヒットしなかった場合は、もしも第5パラメータに数値の2が指定されたのでなければ""が返ります。

第5パラメータに数値の2が指定されてる場合で何もヒットしなかった場合(置換が実行されなかった場合)にはパラメータ2の文字列がそのまま返ります。
 ReplaceRegularNoCaseSense関数は、大文字/小文字を区別しないで検索する以外は、ReplaceRegular関数とまったく同じです。

注意:ReplaceRegular/ReplaceRegularNoCaseSense関数の第5パラメータに数値の2を指定出来るようになったのは、HmJre.dllのV3.39以降からになります。V3.38以下の場合は数値の2を指定しても1が指定されたのと同じ扱いになってしまいます。その辺ご注意ください。
もしも一般ユーザー様向けにマクロを配布しないといけない場合はHmJre.dllのバージョンをチェックする処理を入れるか、またはパラメータ5には数値の2を入れない使い方をお願いします。
$s = dllfuncstr( "ReplaceRegular", "([a-z]+)([0-9]+)", "--abcdefg1234567--", 0, "\\2\\1" );
message $s;


FindSimilar、FindSimilarMinimumMiss関数(V5.00から)
 FindSimilarおよびFindSimilarMinimumMiss関数は、いわゆる「類似検索」を実行します。ヒットした位置を返します。
第1パラメータ(文字列型):検索したい文字列を指定します。
第2パラメータ(文字列型):検索対象の文字列を指定します。
第3パラメータ(数値型):検索を開始する桁位置を指定します。先頭から検索したい場合は0を指定します。
第4パラメータ(文字列型):類似検索でのミスの許容数(いわゆるレーベンシュタイン距離)を指定します。
返り値(数値型):ヒットした位置を返します。ヒットしなかった場合は-1を返します。
 ヒットした場合、GetLastMatchLength関数でヒットした文字列の長さが取得できます。

 FindSimilar関数は、パラメータで指定されたレーベンシュタイン距離の範囲内でヒットする物のうち、なるべく長めの文字列にヒットする方を優先します。
 FindSimilarMinimumMiss関数は、レーベンシュタイン距離が最小になる物に優先してヒットするように動作します。
 FindSimilarの方が多少高速動作します。
 FindSimilarMinimumMiss関数で何かヒットした場合、GetLastSimilarMissCountって関数を使ってヒットした文字列のミスの数(レーベンシュタイン距離)も取得できます。
loaddll "HmJre.dll";
$find = "あいうえお";
$target1 = "xxxあいえおxxx";        //1文字足りない
$target2 = "xxxあいううえおxxx";    //1文字多い
$target3 = "xxxあいカえおxxx";      //1文字違う

#x = dllfunc("FindSimilarMinimumMiss", $find, $target1, 0, 1);
message $target1 + "\n ヒット位置 = " + str(#x)
          + " 長さ=" + str(dllfunc("GetLastMatchLength"))
          + " ミス数=" + str(dllfunc("GetLastSimilarMissCount"));
#x = dllfunc("FindSimilarMinimumMiss", $find, $target2, 0, 1);
message $target2 + "\n ヒット位置 = " + str(#x)
          + " 長さ=" + str(dllfunc("GetLastMatchLength"))
          + " ミス数=" + str(dllfunc("GetLastSimilarMissCount"));
#x = dllfunc("FindSimilarMinimumMiss", $find, $target3, 0, 1);
message $target3 + "\n ヒット位置 = " + str(#x)
          + " 長さ=" + str(dllfunc("GetLastMatchLength"))
          + " ミス数=" + str(dllfunc("GetLastSimilarMissCount"));


ユニコード文字を扱う時の注意、および、SetUnicodeIndexAutoConvert関数
 FindRegular/ReplaceRegular等の関数にユニコード文字を含む文字列を渡す場合、普通だと、ユニコード文字1文字が4バイトのデータとして渡される形となります。その結果、例えば返り値の値が、通常の文字インデックスの値とずれることになります。
 このずれを解消する方法は以下の2種類があります。

  • 秀丸エディタのV8.00以降から追加されている、byteindex_to_charindexおよびcharindex_to_byteindex関数を使う方法。
  • HmJre.dllのV3.13から追加された、SetUnicodeIndexAutoConvert関数で、HmJre.dll側での文字コードインデックス自動変換をONにする方法。

前者の方法については、具体的には、

  • HmJre.dll側に渡す桁位置はcharindex_to_byteindex関数で変換した値を渡す。
  • HmJre.dll側から返される桁位置/文字列長さはbyteindex_to_charindex関数で変換する。


 のようにすれば大丈夫です。
loaddll "hmjre.dll";
#xTarget = 1;		//1桁目から検索の場合
$target = "\u00C0\u00C1\u00C2";
#x = dllfunc( "FindRegular", "\u00C1", $target, charindex_to_byteindex( $target, #xTarget ) );
#len = dllfunc( "GetLastMatchLength");
message "変換前: x= " + str(#x) + "  len=" + str(#len);
#x = byteindex_to_charindex( $target, #x );
#len = byteindex_to_charindex( midstr( $target, #x, 99999 ), #len );
message "変換後: x= " + str(#x) + "  len=" + str(#len);
endmacro;


後者の方法については、FindRegular等の関数呼び出しをする前に、SetUnicodeIndexAutoConvert関数を、数値のパラメータとして「1」を指定して呼び出せばいいです。ちなみに数値の「0」を指定して呼び出すと、元(変換しない)に戻ります。
 注意:この関数を使って自動変換させる方法は、秀丸エディタのV8.00β45以上、および秀丸メールのV5.34β9以上でないとうまく機能しません。また、秀丸エディタ/秀丸メールから直接loaddll文(またはloaddll関数)でロードした場合でないとダメです。
loaddll "hmjre.dll";
#n = dllfunc("SetUnicodeIndexAutoConvert", 0);
$target = "\u00C0\u00C1\u00C2";
#x = dllfunc( "FindRegular", "\u00C1", $target, 0 );
#len = dllfunc( "GetLastMatchLength");
message "変換OFF: x= " + str(#x) + "  len=" + str(#len);
#n = dllfunc("SetUnicodeIndexAutoConvert", 1);
$target = "\u00C0\u00C1\u00C2";
#x = dllfunc( "FindRegular", "\u00C1", $target, 0 );
#len = dllfunc( "GetLastMatchLength");
message "変換ON: x= " + str(#x) + "  len=" + str(#len);
endmacro;


エンコードの種類が外国語の場合の注意、および、NotifyEncode関数
 HmJre.dllを呼び出す用の秀丸エディタ上での「エンコードの種類」が外国語になっていると、HmJre.dllに渡される文字列が外国語になるせいで、うまくヒットしたりしなかったりの動作がおかしくなることがあります。外国語の場合でも正しく動作させるには、NotifyEncode関数を呼び出してもらう必要があります。
 NofityEncode関数のパラメータに「encode」キーワードの値をそのまま渡してください。返り値は無視してください。

 NotifyEncode関数は、HmJre.dllのVersion 5.01から追加されてます。Version 5.01のHmJre.dllは、秀丸エディタのVersion 8.74以上および秀丸メールのVersion 6.72以上から添付されてるので、それより古い秀丸エディタ/秀丸メールではエラーになります。その点もご注意ください。外国語のエンコード上で実行する必要が無い場合は呼び出さないのがお勧めです。
loaddll "hmjre.dll";
#dummy = dllfunc("SetUnicodeIndexAutoConvert", 1);
#dummy = dllfunc("NotifyEncode", encode);
#n = dllfunc( "FindRegular", "pattern", "target-string", 0 );
if( #n >= 0 ) {
    message "ヒットしました。";
}
改行を含む文字列の扱いについて
 HmJre.dllの関数に渡す検索対象文字列に改行コードを含める場合で、改行コードに関係した正規表現パターンで検索する場合、文字列に含まれる改行コードは「\n」、つまり、16進数の文字コードで0x0Aの1バイトだけである必要があります。

 例えば秀丸マクロのgettext関数で改行コードを含む文字列を変数に取り込んだ場合、改行コードは「\r\n」の2バイトのデータとなります。なので、これをこのままFindRegular等の関数に渡しても、例えば「\n」や「$」にうまくヒットしません。
 「\r\n」となってしまった改行コード「\n」に変換するには、ReplaceRegular関数を使うのがお勧めです。
$s = gettext( seltopx, seltopy, selendx, selendy );
loaddll "hmjre.dll";
$s = dllfuncstr("ReplaceRegular", "\r\n", $s, 0, "\n", 2 );
 このように変換すれば、正規表現パターンの中の「\n」や「$」が正しくヒットします。



改行を含む文字列+「^」の場合
 HmJre.dllの正規表現パターンでの「^」は行頭にヒットする正規表現パターンとなっています。しかし、実はHmJre.dllの中では行頭にはヒットせず、検索対象文字列の先頭にのみヒットする動作となります。
 例えば「123\nabc」の文字列をFindRegular関数に渡して、「^abc」で検索しても、「abc」の部分にはヒットしません。
 これはすみませんがこういう仕様ということで使っていただくしかありません。
 改行コードも正しく認識して「行頭」にヒットさせるには、「^」の代わりに、例えば
(?<=^|\n)
 のような正規表現パターンを使う必要があります。例えば「^abc」相当にするには「(?<=^|\n)abc」のように記述する必要があります。