RegExMatch

文字列がパターン(正規表現)を含むかどうかを判定します。

FoundPos := RegExMatch(Haystack, NeedleRegEx , &OutputVar, StartingPos)

パラメータ

Haystack

型:文字列

内容を検索する文字列。バイナリーゼロを含む場合があります。

NeedleRegEx

型:文字列

検索するパターンで、Perl互換正規表現(PCRE)です。パターンのオプションがある場合は、文字列の先頭に含める必要があり、その後に閉じ括弧が続きます。例えば、i)abc.*123というパターンは、大文字小文字を区別しないオプションをオンにし、「abc」の後に任意の文字が0回以上出現し、その後に「123」が続くものを検索対象とします。オプションがない場合、「)」はオプションです。例えば、)abcabcと同等です。

NeedleRegExはバイナリーゼロを含むことができませんが、Haystack内のバイナリーゼロに一致させるために、パターン\x00を使用することができます。

&OutputVar

型:VarRef

If omitted, no output variable will be used. Otherwise, specify a reference to the output variable in which to store a match object, which can be used to retrieve the position, length and value of the overall match and of each captured subpattern, if any are present.

パターンが見つからない場合(つまり、関数が0を返す場合)、この変数は空白にされる。

StartingPos

型:整数

If omitted, it defaults to 1 (the beginning of Haystack). それ以外の場合は、2文字目から始める場合は2、3文字目から始める場合は3、といった具合に指定します。StartingPosHaystackの長さを超えている場合、Haystackの末尾にある空の文字列から検索を開始します(通常、一致しない結果になります)。

負のStartingPosを指定すると、その位置で右からスタートする。例えば、-1は最後の文字から、-2はその次の文字から始まります。StartingPosHaystackの左端を越えようとした場合、Haystackの全てが検索される。

0を指定すると、Haystackの末尾、つまり最後の文字の右側の位置から開始します。これは、(?<=a)のようなゼロ幅のアサーションで使用することができます。

StartingPosの値に関係なく、戻り値は常にHaystackの最初の文字からの相対値です。例えば、「123abc789」の「abc」の位置は、常に4です。

戻り値

型:整数

この関数は、文字列Haystackの中でNeedleRegExが最も左側に出現する位置を返します。ポジション1が最初の文字です。パターンが見つからない場合は0が返される。

エラー

シンタックスエラー:パターンに構文エラーが含まれる場合、以下のようなメッセージとともにErrorが投げられる:Compile error N at offset M: description。その文字列の中で、NはPCREのエラー番号、Mは正規表現内の問題のある文字の位置、descriptionはエラーを説明するテキストである。

実行エラー:正規表現の実行中にエラーが発生した場合、Errorが投げられます。エラーオブジェクトのExtraプロパティには、PCREのエラー番号が記載されています。このようなエラーは稀ですが、発生しやすいのは「空文字列の可能性が多すぎる」(-22)、「再帰が深すぎる」(-21)、「マッチの限界に達した」(-8)です。このような場合は、可能な限り * を ?、+、{0,3} のような制限に置き換えるなど、より制限の多いパターンに設計し直すようにしてください。

オプション

See RegEx Quick Reference for options such as i)abc, which turns off case-sensitivity.

マッチオブジェクト(RegExMatchInfo)

一致した場合、一致した情報を含むオブジェクトがOutputVarに格納される。このオブジェクトは、以下のメソッドとプロパティを持ちます:

Match.PosMatch.Pos[N] または Match.Pos(N):全体一致の位置、または取り込んだサブパターンの位置を返します。

Match.LenMatch.Len[N] または Match.Len(N):全体的なマッチの長さ、またはキャプチャしたサブパターンの長さを返します。

Match.Name[N] または Match.Name(N):与えられたサブパターンがある場合、その名前を返します。

Match.Count:Nの最大値でもある、全体のサブパターン(捕獲グループ)数を返す。

Match.Mark:最後に出会った(*MARK:NAME)NAMEを、該当する場合に返します。

Match[] または Match[N]:全体的なマッチ、またはキャプチャしたサブパターンを返します。

以上のことから、Nは以下のいずれかになることができます:

Match.N:Match["N"]の略記で、Nは定義されたプロパティ(上記一覧)と衝突しない任意の引用されていない名前または数字です。例えば、match.1match.Yearなどです。

また、このオブジェクトは列挙をサポートしています。つまり、forループがサポートされています。または、LoopMatch.Countを使用します。

パフォーマンス

大きな文字列の中の単純な部分文字列を検索するには、RegExMatchよりも高速なInStrを使用します。

パフォーマンスを向上させるため、最近使用された100個の正規表現をメモリ上にキャッシュしておく(コンパイルされた状態)。

学習オプション(S)は、(ループ内などで)何度も使用される正規表現のパフォーマンスを向上させることができる場合があります。

備考

サブパターンには、パターン(?P<Year>\d{4})におけるYearという単語のような名前を付けることができる。このような名前は、最大32文字の英数字とアンダースコアで構成されます。名前付きサブパターンにも番号が振られるため、「Year」の後に名前なしサブパターンが発生した場合、OutputVar[1]ではなくOutputVar[2]に格納されることに注意しましょう。

abc123 のようなほとんどの文字は、正規表現の中で文字通り使用することができます。しかし、\.*?+[{|()^$ の集合に含まれる文字は、リテラルとみなされるためには、その前にバックスラッシュが必要です。例えば、\.はリテラルピリオド、\\はリテラルバックスラッシュです。エスケープを回避するには、\Q...\Eを使用します。For example: \QLiteral Text\E.

正規表現の中で、タブや改行などの特殊文字は、アクセント記号(`)またはバックスラッシュ(\)でエスケープすることができます。For example, `t is the same as \t except when the x option is used.

正規表現の基本を学ぶ(またはパターン構文の記憶を取り戻す)には、RegExクイックリファレンスをご覧ください。

AutoHotkeyの正規表現は、www.pcre.orgのPerl-compatible Regular Expressions (PCRE)を使用して実装されています。

の中で、a ~= bRegExMatch(a, b)の略記として使うことができます。

RegExReplace正規表現クイックリファレンス正規表現の吹き出しInStrSubStrSetTitleMatchMode RegExGlobal matching and Grep (アーカイブ・フォーラムのリンク)

テキストデータの一般的なソース:FileReadDownloadA_ClipboardGUI Edit コントロール

一般的なRegExの例については、RegExクイックリファレンスをご覧ください。

一致した位置である4を報告する。

MsgBox RegExMatch("xxxabc123xyz", "abc.*xyz")

7を報告するのは、$がマッチを最後にすることを要求しているからです。

MsgBox RegExMatch("abc123123", "123$")

大文字小文字を区別しないオプションで一致したため、1を報告します。

MsgBox RegExMatch("abc123", "i)^ABC")

1を報告し、SubPat[1]に "XYZ "を格納する。

MsgBox RegExMatch("abcXYZ123", "abc(.*)123", &SubPat)

スタート位置が1ではなく2のため、1ではなく7を報告する。

MsgBox RegExMatch("abc123abc456", "abc\d+",, 2)

Matchオブジェクトの使い方を説明します。

FoundPos := RegExMatch("Michiganroad 72", "(.*) (?<nr>\d+)", &SubPat)
MsgBox SubPat.Count ": " SubPat[1] " " SubPat.Name[2] "=" SubPat.nr  ; Displays "2: Michiganroad nr=72"

ファイルの拡張子を取得します。なお、SplitPathを使用することも可能で、そちらの方がより確実です。

Path := "C:\Foo\Bar\Baz.txt"
RegExMatch(Path, "\w+$", &Extension)
MsgBox Extension[]  ; Reports "txt".

AutoHotkey v1のTransform Derefと同様に、他の変数内に含まれる変数参照やエスケープシーケンスを展開する機能を以下に示します。さらに、この例では、最初のマッチで停止するのではなく、文字列内のすべてのマッチを検索する方法を示しています(JavaScriptのRegExのgフラグに似ています)。

var1 := "abc"
var2 := 123
MsgBox Deref("%var1%def%var2%")  ; Reports abcdef123.

Deref(Str)
{
    spo := 1
    out := ""
    while (fpo:=RegexMatch(Str, "(%(.*?)%)|``(.)", &m, spo))
    {
        out .= SubStr(Str, spo, fpo-spo)
        spo := fpo + StrLen(m[0])
        if (m[1])
            out .= %m[2]%
        else switch (m[3])
        {
            case "a": out .= "`a"
            case "b": out .= "`b"
            case "f": out .= "`f"
            case "n": out .= "`n"
            case "r": out .= "`r"
            case "t": out .= "`t"
            case "v": out .= "`v"
            default: out .= m[3]
        }
    }
    return out SubStr(Str, spo)
}