RegExコールアウトは、正規表現パターンマッチングの途中でスクリプトに一時的に制御を渡す手段を提供する。PCRE標準のコールアウト機能の詳細については、pcre.txtをご覧ください。
RegExコールアウトは現在、RegExMatchと RegExReplaceでのみサポートされている。
AutoHotkeyのRegExコールアウトの構文は、(?CNumber:Function)で、NumberとFunctionの両方はオプションです。コロン「:」は、Functionが指定されている場合のみ許可され、Numberが省略されている場合はオプションである。
A callout function must be provided by either formally defining it or assigning it to a variable within the scope of the function which called RegExMatch or RegExReplace (local or global). If Function is omitted, it defaults to pcre_callout. If no variable is found or its value is not a function object, an error is thrown.
MyFunction(Match, CalloutNumber, FoundPos, Haystack, NeedleRegEx)
{
...
}
RegExコールアウト関数は、最大5つのパラメータを定義することができる:
これらの名称はあくまでも示唆的なものである。実際の名称は異なる場合がある。
警告呼び出し中にRegExReplaceまたはRegExMatchの入力パラメータを変更することはサポートされておらず、予測不可能な動作を引き起こす可能性があります。
パターンマッチングは、RegExコールアウト関数の返り値によって進行したり失敗したりする:
事例:
Haystack := "The quick brown fox jumps over the lazy dog."
RegExMatch(Haystack, "i)(The) (\w+)\b(?CCallout)")
Callout(m, *) {
MsgBox "m[0]=" m[0] "`nm[1]=" m[1] "`nm[2]=" m[2]
return 1
}
上記の例では、コールアウトは、RegExコールアウトの前にあるパターン部分にマッチする部分文字列ごとに1回ずつ呼び出される。\bは、The quic、The qui、The quなどのマッチで、不完全な単語を除外するために使用されます。
RegEx関数への入力パラメータのいずれかがコールアウト中に変更された場合、動作は未定義となる。
追加情報は、A_EventInfoを介してpcre_callout_block構造体にアクセスすることで得られます。
version := NumGet(A_EventInfo, 0, "Int")
callout_number := NumGet(A_EventInfo, 4, "Int")
offset_vector := NumGet(A_EventInfo, 8, "Ptr")
subject := NumGet(A_EventInfo, 8 + A_PtrSize, "Ptr")
subject_length := NumGet(A_EventInfo, 8 + A_PtrSize*2, "Int")
start_match := NumGet(A_EventInfo, 12 + A_PtrSize*2, "Int")
current_position := NumGet(A_EventInfo, 16 + A_PtrSize*2, "Int")
capture_top := NumGet(A_EventInfo, 20 + A_PtrSize*2, "Int")
capture_last := NumGet(A_EventInfo, 24 + A_PtrSize*2, "Int")
pad := A_PtrSize=8 ? 4 : 0 ; Compensate for 64-bit data alignment.
callout_data := NumGet(A_EventInfo, 28 + pad + A_PtrSize*2, "Ptr")
pattern_position := NumGet(A_EventInfo, 28 + pad + A_PtrSize*3, "Int")
next_item_length := NumGet(A_EventInfo, 32 + pad + A_PtrSize*3, "Int")
if (version >= 2)
mark := StrGet(NumGet(A_EventInfo, 36 + pad + A_PtrSize*3, "Int"), "UTF-8")
For more information, see pcre.txt, NumGet and A_PtrSize.
Including C in the options of the pattern enables the auto-callout mode. このモードでは、(? C255)は、パターン内の各項目の前に挿入される。たとえば、次のテンプレートを使用して正規表現をデバッグできます:
; Call RegExMatch with auto-callout option C.
RegExMatch("xxxabc123xyz", "C)abc.*xyz")
; Define the default RegEx callout function.
pcre_callout(Match, CalloutNumber, FoundPos, Haystack, NeedleRegEx)
{
; See pcre.txt for descriptions of these fields.
start_match := NumGet(A_EventInfo, 12 + A_PtrSize*2, "Int")
current_position := NumGet(A_EventInfo, 16 + A_PtrSize*2, "Int")
pad := A_PtrSize=8 ? 4 : 0
pattern_position := NumGet(A_EventInfo, 28 + pad + A_PtrSize*3, "Int")
next_item_length := NumGet(A_EventInfo, 32 + pad + A_PtrSize*3, "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
; 続けるにはPauseボタンを押してください。
Pause
}
RegExコールアウトは現在の準スレッド上で実行されるが、RegExコールアウト関数が戻った後、A_EventInfoの以前の値が復元される。
PCREは、マッチが不可能と判断された場合、早期に中断するように最適化されている。このような場合にすべてのRegExコールアウトを呼び出すには、パターンの最初に(*NO_START_OPT)を指定して、これらの最適化を無効にする必要があるかもしれない。