Autoit 入門書

Autoit|正規表現 – 文字列から指定したパターンの文字列を検索、置き換え

正規表現を使用すると、複雑な文字列から指定した文字のみを取得したり、置き換えをすることが出来ます。

テキストファイルの内容を変更する時などにとても便利ですので、習得することをおすすめします。

正規表現

StringRegExp

複雑な文字列から指定したパターンの文字列を検索します。

形式:StringRegExp(“調べる文字列”, “パターン” [, フラグ] [, offset ] ])

フラグ値
0 :1(一致) 、0(不一致)を返します。
1 :一致情報の配列を返します。
2 :完全一致(Perl/PHP スタイル)を含む一致情報の配列を返します。
3 :グローバルマッチの配列を返します。
4 :完全一致(Perl/PHP スタイル)を含むグローバルマッチの配列を格納した配列を返します。

例1.文字列から電話番号を検索

私の電話番号は 090-1234-5678 です。
郵便番号は123-4567です。
兄の電話番号は080-9876-5432です。

上記の三行の文字列から正規表現を使って電話番号のみを検索するサンプルです。

#include <Array.au3>

Local $String = '私の電話番号は 090-1234-5678 です。' & _
        '郵便番号は123-4567です。' & _
        '兄の電話番号は080-9876-5432です。'

$String = StringRegExp($String, '0\d\d-\d\d\d\d-\d\d\d\d', 3)
If Not @error Then _ArrayDisplay($String, "電話番号")

;~ 指定したパターン
;~ '0\d\d-\d\d\d\d-\d\d\d\d'

;~ ここで指定したパターンは次のように書くこともできます。
;~ ’0\d{2}-\d{4}-\d{4}’

;~ 説明
;~ \d = 任意数字(0-9)に一致。
;~ {}(波括弧)で囲まれている数字は{}の前のパターンの繰り返し回数です。
;~ \d{4} = 4回連続している0-9の数字を表しています。

例2.文字列からIPアドレスのみ取得

\\192.168.8.30\log\autoit

上記の文字列から正規表現を使ってIPアドレスのみ取得するサンプルです。

Local $Str = '\\192.168.8.30\log\autoit'
Local $Test = StringRegExp($Str, '(?:\d{1,3}\.){3}\d{1,3}', 1)
MsgBox(0, 'IPアドレス', $Test[0])

StringRegExpReplace

正規表現を使用して文字列の置き換えを行います。
StringRegExpReplace(“調べる文字列”, “パターン””, “マッチした文字列に対して置き換える文字列”, [ 文字列内での入れ換え実行回数 ] )

該当するグループテキストを挿入するために、\0 – \9 (または $0 – $9)が後方参照として使用可能です。

通常は StringReplace 関数を使用すれば文字列の置き換えができますが、複雑なパターンで置き換えをしたい場合は、正規表現が必要になります。

例.文字列からIPアドレスのみ取得

\\192.168.8.30\log\autoit

上記の文字列から正規表現を使ってIPアドレスのみ取得するサンプルです。

Local $Str = '\\192.168.8.30\log\autoit'
Local $Test = StringRegExpReplace($Str, '\\*((?:\d+\.){3}\d+)\\.*', '$1')
MsgBox(0, '置き換え結果', $Test)

Local $Test = StringRegExpReplace($Str, ‘\((?:\d+.){3}\d+)\.’, ‘$1’)

上記のコードでは、後方参照の「$1」は「((?:\d+.){3}\d+)」の部分を意味しています。

「((?:\d+.){3}\d+)」以外の文字列はすべて空白に置き換えています。

パターン「\\((?:\d+.){3}\d+)\\.*」では、文字列「\\192.168.8.30\log\autoit」すべてにマッチしており、後方参照「$1」で「((?:\d+.){3}\d+)」の部分(IPアドレス)のみを返すようにしています。

初めて正規表現に触れる方は非常に難しいものですが、パターンをすべて理解しようとするのではなく、1つ1つ確実に意味を理解していくことが速く習得する近道となります。

正規表現を使用するとプログラミングをする際に非常に便利なので、是非習得してみてください。

正規表現のパターン

正規表現で使用する文字 AutoItのドキュメントから引用(いくつかマッチング用文字を追加しています)

メタ文字メタ文字とは、正規表現で使用する特別な意味を持つ文字のことを言います。
\ ^ . $ *+ ? | ( ) [ ] { }
文字クラスメタ文字– ^
[ … ]文字クラス。リストの中の任意の1文字と一致。
リストの中の複数の文字のどれかにマッチすると言えばわりやすいかと思います。

例:[aeiou]は「aiueo」一致します。

リストの中の任意の1文字と一致するので、文字列が「u」のみでもマッチすることになります。
文字クラスの中で「-」(ダッシュ)を使えば[123456789]を[1-9]のように書くことができます。
どちらも同じ意味で、1~9の数字どれかにマッチします。
文字列に1~9すべてが含まれていれば、すべてにマッチします。
他にも、[a-z]、[A-Z] 、[0-9a-zA-Z]というように書くこともできます。
この「-」(ダッシュ)を文字クラスメタ文字と言います。
「-」(ダッシュ)にマッチしたい場合、[-a-z]または[a-z-]というように文字クラスの最初
または最後にダッシュを書きます。
角カッコにマッチさせたい場合、[[]]、または [][] というように書きます。
特殊な意味をもつ文字は文字クラス内では特殊な意味をもつ文字として扱われません。ただし例外的に\\\^\-\[\]はエスケープされているものとしてセット内で扱われます。
[^ … ]否定文字クラス。リストの中の任意の1文字以外と一致。
「^」(キャレット)も文字クラスメタ文字です。

[^0-9]は数字以外の全ての文字と一致します。

キャレットを検索する場合は開始直後に置くか、エスケープ(\^)します。
例:文字列「\^」にマッチさせる場合、[\\^]と書きます。
[\\^]の中の「^」(キャレット)は文字クラスメタ文字ではありません。
※この「^」(キャレット)は文字クラス以外では別の意味を持ちます。
[:class:]指定された文字クラスとの一致。有効なクラス:alpha(任意のアルファベット文字)、alnum(任意の英数字)、lower(任意の小文字)、upper (任意の大文字)、digit (0-9の任意の数字)、xdigit (0-9、A-F、a-f の任意の16進数数字)、space (任意のホワイトスペース文字)、blank (スペースまたはタブ)、print (任意の印刷可能文字)、graph (スペースを除く任意の印刷可能文字)、cntrl (任意の制御文字[ascii 127 、32以下])、punct (任意の句読点文字)。また[0-9]は[[:digit:]]と等しいです。 
[^:class:]指定された文字クラス以外との一致。ただし最初の文字だけです。
( … )グループ。グループ内の要素は並び順に扱われ、繰り返し処理時に一緒に取り扱われます。例:(ab)+は”ab”、”abab”に一致しますが”aba”には一致しません。またフラグによっては後方参照、関数の返す配列に使用するために一致したテキストを保持します。
(?i)大文字小文字非区別フラグ。グループとしては動作しません。正規表現エンジンが大文字小文字の区別をしないように設定します。
(?-i)(デフォルト)大文字小文字区別フラグ。グループとしては動作しません。正規表現エンジンが大文字小文字の区別をするように設定します。 
(?: … )非キャプチャーグループ。一致文字を配列に記録しない、後方参照に使用しない以外は通常のグループと同じです。
(?i: … )大文字小文字非区別、非キャプチャーグループ。大文字小文字の区別をしない以外は通常の非キャプチャーグループと同じです。
(?-i: … )大文字小文字区別、非キャプチャーグループ。大文字小文字の区別をする以外は通常の非キャプチャーグループと同じです。
(?m)行内マッチモード。このモードでは「^」(キャレット)、「$」(ドル)は特別な意味を持ちます。
(?s)「.」は改行を含む任意の文字と一致します。
デフォルトでは「.」は改行とは一致しません。
(?x)ホワイトスペースと#コメントを無視します。
(?U)強欲な量指定子の反転。例 文字列:abababab
正規表現:[a-z]+

結果:配列は1つ。配列[0]の中身は「abababab」となります。正規表現:(?U)[a-z]+結果:配列は8つ、配列の中身は[0]a
[1]b

[2]a

[3]b

[4]a

[5]b

[6]a

[7]bとなります。
^\A と同じ意味。すべての行の最初の位置にマッチ。
(?m)を使用した場合、文字列の先頭と改行の直後。
$\Z と同じ意味。すべての行の最後の位置にマッチ。
(?m)を使用した場合、改行の直前と文字列の末尾。
(?=…)肯定の先読み。
例:test(?=パターン)
文字列「パターン」が後に続く「test」にマッチ。
(?!…)否定の先読み。
例:test(?!パターン)
文字列「パターン」が後に続かない「test」にマッチ。
(?<=…)肯定の後読み。
例:(?<=パターン)test
文字列「パターン」が前にある「test」にマッチ。
※後読みでは反復文字 +、 * 、{0,}、{1,} を使用できません。
(?<!…)否定の後読み。
例:(?<!パターン) test
文字列「パターン」が前にない「test」にマッチ。
※後読みでは反復文字 +、 * 、{0,}、{1,} を使用できません。
(?>…)バックトラック。例:(?>a)aab は「aaab」にマッチするが、「acaab」にはマッチしない。
「aaab」にマッチするが、「aaab」の最初の「a」が必ず存在している必要がある。
※バックトラックでは反復文字 +、 * 、{0,}、{1,} を使用できません。
.任意の文字と一致(改行文字(\n)を除く)。
|OR。式の片方またはもう片方との一致。
\特殊文字のエスケープ(実際の文字との一致)または特殊文字タイプの導入(下記参照)。
\\バックスラッシュ(\)に一致。
\aアラーム。BEL文字 (chr(7))。
\A文字列開始位置でのみ一致。
\b単語境界位置でのみ一致。
\B非単語境界位置でのみ一致。
\c次の文字に基づく制御文字に一致。例えば\cMはctrl-Mに一致する。
\d任意数字(0-9)に一致。
\D任意非数字に一致。
\eエスケープ文字(chr(27))に一致。
\Eケース終了。
\fフォームフィード文字(chr(12))に一致。
\h任意の水平ホワイトスペース文字。
\H任意の非水平ホワイトスペース文字。
\nラインフィード(@LF, chr(10))に一致。
\Q\Eまでメタ文字パターンの引用(無効)。※メタ文字を通常の文字として扱う。
\rキャリッジリターン(@CR, chr(13))に一致。
\s任意のホワイトスペース文字に一致。ホワイトスペース文字:Chr(9)からChr(13)の水平タブ、垂直タブ、フォームフィード、キャリッジリターンと標準スペース( Chr(32) )。
\Sホワイトスペース文字以外に一致。
\tタブ文字(chr(9))に一致。
\v任意の垂直ホワイトスペース文字。
\V任意の非垂直ホワイトスペース文字。
\w任意の”単語”文字に一致。a-z、A-Z、0-9またはアンダーバー(_)。
\W非単語文字に一致。
\###指定されたasciiコードまたは後方参照のasciiコードと対応する文字に一致。8進数で3桁まで。
見つかった場合、後方参照に一致。指定された先のグループ番号と正確に一致します。例えば([:alpha:])\1は二重文字(ダブルレター)と一致します。
\x##16進数で与えられたasciiコードと対応する文字に一致。2桁まで。
\z文字列終了位置でのみ一致。
\Z文字列終了位置、改行文字直前でのみ一致。

反復文字

{x}直前の1文字、文字クラス、グループをx回繰り返し。
{x,}直前の1文字、文字クラス、グループを最小x回からそれ以上繰り返し。
{0,x}直前の1文字、文字クラス、グループを最小0回から最大x回繰り返し。
{xy}直前の1文字、文字クラス、グループをx回からy 回繰り返し。
*直前の1文字、文字クラス、グループを0回以上繰り返し。{0,}と同じ。
+直前の1文字、文字クラス、グループを1回以上繰り返し。{1,}と同じ。
?直前の1文字、文字クラス、グループが0回または1回出現。{0, 1}と同じ。
? (反復文字の後ろ)最大の一致の代わりに最小の一致を見つけます。

文字クラス

[:alnum:]文字と数字
[:alpha:]文字
[:ascii:]文字コード 0-127
[:blank:]スペースとタブ
[:cntrl:]制御文字
[:digit:]10進数の数字 (\dと同じ)
[:graph:]スペースを除く印字文字。
[:lower:]小文字
[:print:]スペースを含む印字文字。
[:punct:]文字と数字を除く印字文字。
[:space:]ホワイトスペース(\sとは異なる。\sはVT: chr(11)を含む)
[:upper:]大文字
[:word:]“単語”文字(\wと同様)
[:xdigit:]16進数

コメント