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