Regular Expression Callouts
AHKL [AHK_L 14+]: コールアウトは正規表現パターンマッチの評価中にスクリプトによるコントロールをする手段を提供する。
PCRE(Perl Compatible Regular Expression: Perl互換正規表現)標準のコールアウト機能に関する詳細は pcre.txt を参照のこと。
コールアウト機能は今のところ RegExMatch および RegExReplace のみでサポートされる。
文法[編集]
AutoHotkey_L でコールアウトを利用するための書式は「(?CNumber:Function)
」である。
Number および Function はオプションである。コロン「:
」は Function を指定するときのみ必要で、かつ Number の省略時には任意となる。
Function が指定されていて、それがユーザ定義関数でない場合はコンパイルは、失敗してパターンマッチングは行われない。
Function の省略時には、変数 prce_callout
に呼び出す関数名を格納しておく必要がある。
同名のグローバル変数とローカル変数の双方に有効な関数名がある場合は、ローカル変数が優先される。
変数 pcre_callout に有効なユーザ定義関数名が格納されていない場合は、Function の指定がないコールアウトは無視される。
コールアウト関数[編集]
Function(Match, CalloutNumber, FoundPos, Haystack, NeedleRegEx) { ... }
コールアウト関数は最大5個の引数を取ることが可能:
Match | RegExMatch の UnquotedOutputVar 引数と同等で、配列変数の作成を含む。
|
CalloutNumber | コールアウト番号を取得する。 |
FoundPos | 現在の潜在的マッチする位置を取得する。 |
Haystack | RegExMatch または RegExReplace に渡されたマッチング対象文字列。
|
NeedleRegEx | RegExMatch または RegExReplace に渡された正規表現パターン文字列。
|
引数名はあくまで例で、任意に設定が可能。
コールアウト関数の戻り値によって、パターンマッチの続行または失敗が決定される:
- 0または数値以外の値を返す場合: マッチングは通常通り続行する。
- 1以上の数値を返す場合: マッチングは現位置で失敗するが、他のマッチングは続行する
- -1を返す場合: マッチングは中断する。
- -1未満の値を返す場合:PCREのエラーコードとして扱われ、マッチングは中断する。
RegExMatch
は結果として空文字列を返す。一方、RegExReplace
では元のマッチング対象文字列をそのまま返す。どちらの場合でも、ErrorLevel
はエラーコードを格納する。
例)
Haystack = The quick brown fox jumps over the lazy dog. RegExMatch(Haystack, "i)(The) (\w+)\b(?CFunc)") Func(m) { MsgBox m=%m%`nm1=%m1%`nm2=%m2% Return 1 }
上の例では、Func
はサブマッチして切り出された文字列毎に呼び出される。\b
は "The quic" や "The qui" のようにマッチの不完全な単語を除外するのに利用している。
EventInfo[編集]
A_EventInfo を介してpcre_callout_block 構造体にアクセスすることで、さらなる情報を得ることが可能となる。
version := NumGet(A_EventInfo, 0, "Int") callout_number := NumGet(A_EventInfo, 4, "Int") offset_vector := NumGet(A_EventInfo, 8) subject := NumGet(A_EventInfo, 12) subject_length := NumGet(A_EventInfo, 16, "Int") start_match := NumGet(A_EventInfo, 20, "Int") current_position := NumGet(A_EventInfo, 24, "Int") capture_top := NumGet(A_EventInfo, 28, "Int") capture_last := NumGet(A_EventInfo, 32, "Int") callout_data := NumGet(A_EventInfo, 36) pattern_position := NumGet(A_EventInfo, 40, "Int") next_item_length := NumGet(A_EventInfo, 44, "Int")
詳細に関しては pcre.txt を参照すること。
自動コールアウト[編集]
正規表現パターンのオプションにに「C
」を含めることで、自動コールアウトモードが利用可能となる。
このモードでは、コールアウトはパターン内の各要素の直前に「(?C255)
」を挿入したもの同等である。
例として、以下に正規表現のデバッグのテンプレートして利用できるものを挙げる:
; Set the default callout function.
pcre_callout = DebugRegEx; Call RegExMatch with auto-callout option C.
RegExMatch("xxxabc123xyz", "C)abc.*xyz") DebugRegEx(Match, CalloutNumber, FoundPos, Haystack, NeedleRegEx) {; See pcre.txt for descriptions of these fields.
start_match := NumGet(A_EventInfo, 20, "Int") current_position := NumGet(A_EventInfo, 24, "Int") pattern_position := NumGet(A_EventInfo, 40, "Int") next_item_length := NumGet(A_EventInfo, 44, "Int"); Point out >>current match<<.
_HAYSTACK:=SubStr(Haystack, 1, start_match) . ">>" SubStr(Haystack, start_match + 1, current_position - start_match) . "<<" SubStr(Haystack, current_position + 1); Point out >>next item to be evaluated<<.
_NEEDLE:= SubStr(NeedleRegEx, 1, pattern_position) . ">>" SubStr(NeedleRegEx, pattern_position + 1, next_item_length) . "<<" SubStr(NeedleRegEx, pattern_position + 1 + next_item_length) ListVars; Press Pause to continue.
Pause }
注意点[編集]
コールアウトは現在の擬似スレッド上で実行されるが、コールアウト関数の呼び出しが完了した段階で A_EventInfo
の内容は復元される。
一方、ErrorLevel
に関しては RegExMatch
または RegExReplace
が完了する直前までは準備されていない状態となっている。