RegExMatch

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

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

パラメータ

Haystack

型:文字列

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

NeedleRegEx

型:文字列

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

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、といった具合に指定します。If StartingPos is beyond the length of Haystack, the search starts at the empty string that lies at the end of Haystack (which typically results in no match).

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

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

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

戻り値

型:整数

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

エラー

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

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

Options

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

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

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

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

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

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

Match.Count: Returns the overall number of subpatterns (capturing groups), which is also the maximum value for N.

Match.Mark: Returns the NAME of the last encountered (*MARK:NAME), when applicable.

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

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

Match.N: Shorthand for Match["N"], where N is any unquoted name or number which does not conflict with a defined property (listed above). 例えば、match.1や match.Yearなどです。

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

パフォーマンス

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

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

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

備考

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

abc123 のようなほとんどの文字は、正規表現の中で文字通り使用することができます。However, any of the characters in the set \.*?+[{|()^$ must be preceded by a backslash to be seen as literal. 例えば、.はリテラルピリオド、.はリテラルバックスラッシュです。エスケープを回避するには、\Q...\E.を使用します。事例:\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)を使用して実装されています。

Within an expression, a ~= b can be used as shorthand for RegExMatch(a, b).

RegExReplace, RegEx Quick Reference, Regular Expression Callouts, InStr, SubStr, SetTitleMatchMode RegEx, Global matching and Grep (forum link)

テキストデータの一般的なソース:FileRead, Download, A_Clipboard, GUI Edit controls

一般的な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)
}