Regular Expression Callouts

提供: AutoHotkey Wiki
移動: 案内検索
リファレンス > AutoHotkey_Lとは > 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 RegExMatchUnquotedOutputVar 引数と同等で、配列変数の作成を含む。
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 が完了する直前までは準備されていない状態となっている。