RegExpオブジェクト
RegExpオブジェクトは、正規表現を利用する場合、基本になるオブジェクトで、最初に必ず作成します。4つのプロパティと3つのメソッドを持っています。
Dim re As RegExp '宣言 Set re = New RegExp
これで変数reにRegExpオブジェクトが作成されます。
プロパティ名 | 設定内容 |
Pattern | 正規表現を定義する文字列です。メソッドを呼び出す前に必ず設定されている必要があります。 |
IgnoreCase | 大文字・小文字を区別するかどうかを表すブール値です。Trueに設定すると、大文字・小文字を区別しなくなります。初期値はFalseに設定されています。 |
Global | ReplaceメソッドやExecuteメソッドを呼び出すとき、複数マッチを行うかどうかを表すブール値です。Trueに設定された場合、正規表現にマッチするすべての部分に対して検索・置換が行われます。初期値はFalseに設定されています。 |
MultiLine | 文字列を複数行として扱うかどうかを表すブール値です。Trueに設定すると、各行の先頭や末尾でも"^"や"$"がマッチするようになります。初期値はFalseに設定されています。 |
メソッド名 | 動作内容 |
Test(検索文字列) | 引数として文字列を取り、正規表現とマッチする場合はTrueを返し、一致しない場合はFalseを返します。 |
Replace(検索文字列, 置換文字列) | 引数として2つの文字列を取ります。検索文字列の中で正規表現のマッチに成功すると、そのマッチしたものを置換文字列に置き換えて、新しい文字列を返します。マッチするものが見つからなかった場合は、元の検索文字列が返されます。 |
Execute(検索文字列) | 検索文字列から正規表現とマッチする部分を検索し、検索結果を Matche オブジェクトを含むMatchesコレクションとして返します(詳細は後述)。 |
以下にサンプルをいくつか挙げておきます。
Dim re As RegExp Set re = New RegExp re.Pattern = "^[0-9]+$" '数字のみの文字列を表す正規表現 MsgBox re.Test("01234") 'True MsgBox re.Test("01A34") 'False
Dim re As RegExp Set re = New RegExp re.Pattern = "[A-Za-z]+" 'アルファベットの連続を表す正規表現 MsgBox re.Replace("私はMikeです。", "マイク") '私はマイクです。
Dim re As RegExp Set re = New RegExp re.Pattern = "ABCDEFG" MsgBox re.Test("AbCdEfG") 'False re.IgnoreCase = True MsgBox re.Test("AbCdEfG") 'True
Dim re As RegExp Set re = New RegExp re.Pattern = "ABC" MsgBox re.Replace("ABCDEF ABCDEF ABCDEF", "abc") 'abcDEF ABCDEF ABCDEF re.Global = True MsgBox re.Replace("ABCDEF ABCDEF ABCDEF", "abc") 'abcDEF abcDEF abcDEF
Dim re As RegExp Dim s As String '文字列sを以下のような状態にセットする 'ABC<改行> 'DEF<改行> 'GHI<改行> s = "ABC" & vbCrLf & "DEF" & vbCrLf & "GHI" & vbCrLf Set re = New RegExp re.Pattern = "^D" '行頭にある"D"を表す正規表現 MsgBox re.Test(s) 'False re.MultiLine = True MsgBox re.Test(s) 'True
Executeメソッド
Testメソッドは、文字列が正規表現にマッチしているかどうかを判定するのには便利ですが、具体的にマッチした文字列を取り出したい場合や、マッチする部分が複数ある場合には処理が煩雑になります。そこで、Executeメソッドを使うと、正規表現とマッチさせた結果を1度に取り出すことができます。
具体的には、ExecuteメソッドがMatchesコレクションを返します。そのコレクションの中から、個々のMatcheオブジェクトを取得します。Matchesコレクションは2つ、Matcheオブジェクトは4つのプロパティを持ちます。
プロパティ名 | 設定内容 |
Count | コレクション内に含まれる Match オブジェクトの数を表す読み取り専用の値です。 |
Item | コレクション内に含まれる Match オブジェクトへアクセスするための読み取り専用の値です。Item(n)のような形でアクセスします。n は0から Count - 1の値を取るインデックス値です。 |
プロパティ名 | 設定内容 |
FirstIndex | マッチした部分の位置を表す読み取り専用の値です。検索文字列の最初の位置を0とするオフセット値です。 |
Length | マッチした文字列の長さを表す読み取り専用の値です。 |
Value | マッチした文字列を表す読み取り専用の値です。Matche オブジェクトの既定値になっているので、特にプロパティを指定しない場合はこの値を返します。 |
SubMatches | マッチした文字列の中で、"( )"でグループ化した部分へアクセスするためのSubMatchesコレクションを返します。SubMatches(n)のような形でアクセスします。nは0から始まるインデックス値です。SubMatches.Countでグループ数を返します。 |
以下にサンプルをいくつか挙げておきます。
Dim re As RegExp Dim mc As MatchCollection Dim m As Match Dim i As Integer Set re = New RegExp re.Pattern = "[A-Z]+" 'アルファベット(大文字)の連続を表す正規表現 re.Global = True '複数マッチを有効にする Set mc = re.Execute("ABC DEFG HIJKL MNOPQR STUVWXY") MsgBox "mc.Count = " & mc.Count 'mc.Count = 5 For i = 0 To mc.Count - 1 Set m = mc.Item(i) MsgBox "FirstIndex = " & m.FirstIndex & " Length = " _ & m.Length & " Value = " & m.Value Next i
このサンプルは、"For Each...Nextステートメント"を使って以下のように書き換えることもできます。
Dim re As RegExp Dim mc As MatchCollection Dim m As Match Set re = New RegExp re.Pattern = "[A-Z]+" 'アルファベット(大文字)の連続を表す正規表現 re.Global = True '複数マッチを有効にする Set mc = re.Execute("ABC DEFG HIJKL MNOPQR STUVWXY") MsgBox "mc.Count = " & mc.Count 'mc.Count = 5 For Each m In mc MsgBox "FirstIndex = " & m.FirstIndex & " Length = " & m.Length & " Value = " & m.Value Next m
以下にSubMatchesプロパティの使用例を挙げておきます。
Dim re As RegExp Dim mc As MatchCollection Dim m As Match Dim i As Integer Set re = New RegExp 'アルファベット(大文字)の後に 'アルファベット(小文字)が複数続く文字列を表す正規表現 '大文字と小文字を括弧でそれぞれグループ化する re.Pattern = "([A-Z])([a-z]+)" re.Global = True '複数マッチを有効にする Set mc = re.Execute("Book Pen Apple Flower Sea Tree") MsgBox "mc.Count = " & mc.Count 'mc.Count = 6 For i = 0 To mc.Count - 1 Set m = mc(i) MsgBox "FirstIndex = " & m.FirstIndex & " Length = " _ & m.Length & " Value = " & m.Value & " SubMatches(0) = " _ & m.SubMatches(0) & " SubMatches(1) = " & m.SubMatches(1) Next i End Sub