NextHE パターンマッチング(文字列比較)機能

 秀丸エディタのマクロ用 .DLL です。
メニュー機能
 menu 文ではメニューに追加した項目に自動的に番号が付きますが、NextHE では項目毎に番号を付ける事がでます。
 状況に応じてメニュー項目を除外した表示を提供できるようになります。
 また、サブ・メニューも実装できます。
パターンマッチング(文字列比較)機能
 .NET Framework の正規表現を提供します。
 10 を超える部分取り出し(キャプチャ)を提供します。
連想配列
 連想配列(マップやハッシュとも呼ぶ)を提供します。
関数説明(C/C++) 秀丸エディタ マクロサンプル PowerShell マクロサンプル

関数説明(C/C++)

// 呼び出し規約 #define HEAPI __cdcel // 最初に呼び出す // パターンマッチング・ハンドルを取得する // // 戻り値 // パターンマッチング・ハンドル // // bitState // 通常は 0 を渡す // 呼び元が PowerShell 等 .NET Framework の場合は 1 を渡すと楽に使える LPCONTEXTMATCH HEAPI MatchBegin( INT_PTR bitState ); // 最後に呼び出す // パターンマッチング・ハンドルを破棄する // // lpContext // MatchBegin で取得したパターンマッチング・ハンドル INT_PTR HEAPI MatchEnd( LPCONTEXTMATCH lpContext ); // パターンを設定する // // 戻り値 // パターン設定成功は TRUE // パターン設定失敗は FALSE // // lpContext // MenuBegin で取得したパターンマッチング・ハンドル // lpszPattern // パターン INT_PTR HEAPI MatchOpenW( LPCONTEXTMATCH lpContext, wchar_t const* const lpszPattern ); INT_PTR HEAPI MatchOpenA( LPCONTEXTMATCH lpContext, char const* const lpszPattern ); // 何もしない // // 戻り値 // 必ず TRUE // // lpContext // MenuBegin で取得したパターンマッチング・ハンドル INT_PTR HEAPI MatchClose( LPCONTEXTMATCH lpContext ); // MatchOpenW / MatchOpenA で設定したパターンと文字列を比較する // // 戻り値 // 0 以上は一致。また、キャプチャ数を表す // -1 は不一致 // // lpContext // MenuBegin で取得したパターンマッチング・ハンドル // lpszLine // パターンと比較する文字列 INT_PTR HEAPI MatchDoW( LPCONTEXTMATCH lpContext, wchar_t const* const lpszLine ); INT_PTR HEAPI MatchDoA( LPCONTEXTMATCH lpContext, char const* const lpszLine ); // キャプチャした文字列を取得する // この関数は、事前に MatchDoW / MatchDoA を呼び出して一致している場合に有効 // // 戻り値 // キャプチャした文字列 // // lpContext // MenuBegin で取得したパターンマッチング・ハンドル // nIndex // 取得するキャプチャ番号。0 以上、キャプチャ数以下 // 有効範囲外の場合は 0 として処理する wchar_t const* const HEAPI MatchGetValueW( LPCONTEXTMATCH lpContext, INT_PTR nIndex ); char const* const HEAPI MatchGetValueA( LPCONTEXTMATCH lpContext, INT_PTR nIndex ); // キャプチャした文字列の位置を取得する // この関数は、事前に MatchDoW / MatchDoA を呼び出して一致している場合に有効 // // 戻り値 // キャプチャした文字列の位置 // nIndex が有効範囲外の場合は -1 を返す // // lpContext // MenuBegin で取得したパターンマッチング・ハンドル // nIndex // 位置を取得するキャプチャ番号。0 以上、キャプチャ数以下 INT_PTR HEAPI MatchGetIndex( LPCONTEXTMATCH lpContext, INT_PTR nIndex ); // キャプチャした文字列の長さを取得する // この関数は、事前に MatchDoW / MatchDoA を呼び出して一致している場合に有効 // // 戻り値 // キャプチャした文字列の長さ // nIndex が有効範囲外の場合は -1 を返す // // lpContext // MenuBegin で取得したパターンマッチング・ハンドル // nIndex // 長さを取得するキャプチャ番号。0 以上、キャプチャ数以下 INT_PTR HEAPI MatchGetLength( LPCONTEXTMATCH lpContext, INT_PTR nIndex );

秀丸エディタ マクロサンプル

// NextHE パターン・マッチを使えるように .DLL をロードする loaddll "NextHE.dll"; // .DLL のロードの成功/失敗を確認 if( !result ) { // .DLL のロードに失敗 message ".dllのロードに失敗しました。"; // マクロ終了 endmacro; } // パターン・マッチ開始(パターン・マッチ・ハンドルを取得する) #hMatch = dllfunc( "MatchBegin", 0 ); // パターンを設定する #r = dllfuncw( "MatchOpenW", #hMatch, "^(...)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)" ); // 設定したパターンと文字列を比較する #r = dllfuncw( "MatchDoW", #hMatch, "0123456789abcdefg" ); // キャプチャした文字列を取得する $Value = dllfuncstrw( "MatchGetValueW", #hMatch, 11 ); // キャプチャした文字列の位置を取得する #Index = dllfuncw( "MatchGetIndex", #hMatch, 11 ); // キャプチャした文字列の長さ取得する #Length = dllfuncw( "MatchGetLength", #hMatch, 11 ); // パターン・マッチの結果を通知する message "取得値: " + $Value + "\n位置: " + str(#Index) + "\n文字数: " + str(#Length); // パターン・マッチ終了(パターン・マッチ・ハンドルを破棄する) #r = dllfunc( "MatchEnd", #hMatch ); // .DLL を解放する freedll;

PowerShell マクロサンプル

# PowerShell の場合、-match 等を使えば簡単。 # NextHE.dll のファイル・パス $DLL = 'NextHE.dll' # NextHE クラスを定義(C# ソース) $SourceCS = " using System; using System.Runtime.InteropServices; public class NextHE { [DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl)] public extern static IntPtr MatchBegin( IntPtr bitState ); [DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl)] public extern static IntPtr MatchEnd( IntPtr lpContext ); [DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl, CharSet = CharSet.Unicode)] public extern static IntPtr MatchOpen( IntPtr lpContext, string lpszPattern ); [DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl)] public extern static IntPtr MatchClose( IntPtr lpContext ); [DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl, CharSet = CharSet.Unicode)] public extern static IntPtr MatchDo( IntPtr lpContext, string lpszLine ); [DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl, CharSet = CharSet.Unicode)] public extern static string MatchGetValue( IntPtr lpContext, IntPtr nIndex ); [DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl)] public extern static IntPtr MatchGetIndex( IntPtr lpContext, IntPtr nIndex ); [DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl)] public extern static IntPtr MatchGetLength( IntPtr lpContext, IntPtr nIndex ); }" # NextHE クラスを追加する Add-Type $SourceCS # パターン・マッチ開始(パターン・マッチ・ハンドルを取得する) [IntPtr] $hMatch = [NextHE]::MatchBegin( 1 ) # パターンを設定する $x = [NextHE]::MatchOpen( $hMatch, '^.(..).(\d{3})' ) # 設定したパターンと文字列を比較する $c = [NextHE]::MatchDo( $hMatch, 'xyz98765' ) # キャプチャした文字列を取得する $s = [NextHE]::MatchGetValue( $hMatch, 2 ) # キャプチャした文字列の位置を取得する $i = [NextHE]::MatchGetIndex( $hMatch, 2 ) # キャプチャした文字列の長さ取得する $l = [NextHE]::MatchGetLength( $hMatch, 2 ) # パターン・マッチ終了(パターン・マッチ・ハンドルを破棄する) [void] [NextHE]::MatchEnd( $hMatch ) # パターン・マッチの結果を通知する $s, $i, $l