正規表現の吹き出し

RegExコールアウトは、正規表現パターンマッチングの途中でスクリプトに一時的に制御を渡す手段を提供する。PCRE標準のコールアウト機能の詳細については、pcre.txtをご覧ください。

RegExコールアウトは現在、RegExMatchRegExReplaceでのみサポートされている。

目次

構文

AutoHotkeyのRegExコールアウトの構文は、(?CNumber:Function)で、NumberFunctionの両方はオプションです。コロン「:」は、Functionが指定されている場合のみ許可され、Numberが省略されている場合はオプションである。Functionが指定されているが関数オブジェクトの名前でない場合、コンパイル・エラーが発生し、パターンマッチングは開始されない。

Functionが省略された場合、pcre_calloutというデフォルトのRegExコールアウト関数が定義されなければなりません。pcre_calloutが定義されていない場合、Functionを省略したRegExコールアウトは無視される。

RegEx コールアウト関数

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 quicThe quiThe quなどのマッチで、不完全な単語を除外するために使用されます。

RegEx関数への入力パラメータのいずれかがコールアウト中に変更された場合、動作は未定義となる。

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, "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.

Auto-Callout

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)を指定して、これらの最適化を無効にする必要があるかもしれない。