文字列がパターン(正規表現)を含むかどうかを判定します。
FoundPos := RegExMatch(Haystack, NeedleRegEx , &OutputVar, StartingPos)
型:文字列
内容を検索する文字列。バイナリーゼロを含む場合があります。
型:文字列
検索するパターンで、Perl互換正規表現(PCRE)です。パターンのオプションがある場合は、文字列の先頭に含める必要があり、その後に閉じ括弧が続きます。例えば、i)abc.*123というパターンは、大文字小文字を区別しないオプションをオンにし、「abc」の後に任意の文字が0回以上出現し、その後に「123」が続くものを検索対象とします。オプションがない場合、「)」はオプションです。例えば、)abcはabcと同等です。
NeedleRegExはバイナリーゼロを含むことができませんが、Haystack内のバイナリーゼロに一致させるために、パターン\x00
を使用することができます。
型: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を返す場合)、この変数は空白にされる。
型:整数
If omitted, it defaults to 1 (the beginning of Haystack). それ以外の場合は、2文字目から始める場合は2、3文字目から始める場合は3、といった具合に指定します。StartingPosが Haystackの長さを超えている場合、Haystackの末尾にある空の文字列から検索を開始します(通常、一致しない結果になります)。
負のStartingPosを指定すると、その位置で右からスタートする。例えば、-1は最後の文字から、-2はその次の文字から始まります。StartingPosが Haystackの左端を越えようとした場合、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.
一致した場合、一致した情報を含むオブジェクトが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:Nの最大値でもある、全体のサブパターン(捕獲グループ)数を返す。
Match.Mark:最後に出会った(*MARK:NAME)のNAMEを、該当する場合に返します。
Match[] または Match[N]:全体的なマッチ、またはキャプチャしたサブパターンを返します。
以上のことから、Nは以下のいずれかになることができます:
Match.N:Match["N"]の略記で、Nは定義されたプロパティ(上記一覧)と衝突しない任意の引用されていない名前または数字です。例えば、match.1
や match.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 ~= b
はRegExMatch(a, b)
の略記として使うことができます。
RegExReplace、正規表現クイックリファレンス、正規表現の吹き出し、InStr、SubStr、SetTitleMatchMode RegEx、Global matching and Grep (アーカイブ・フォーラムのリンク)
テキストデータの一般的なソース:FileRead、Download、A_Clipboard、GUI Edit コントロール
一般的なRegExの例については、RegExクイックリファレンスをご覧ください。
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) }