CodeZine(コードジン)

特集ページ一覧

VBAで正規表現を使う

RegExpオブジェクトの利用

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/10/22 14:00

目次

RegExpオブジェクト

 RegExpオブジェクトは、正規表現を利用する場合、基本になるオブジェクトで、最初に必ず作成します。4つのプロパティと3つのメソッドを持っています。

RegExpオブジェクトの作成方法
Dim re As RegExp     '宣言
Set re = New RegExp

 これで変数reにRegExpオブジェクトが作成されます。

プロパティ
プロパティ名設定内容
Pattern正規表現を定義する文字列です。メソッドを呼び出す前に必ず設定されている必要があります。
IgnoreCase大文字・小文字を区別するかどうかを表すブール値です。Trueに設定すると、大文字・小文字を区別しなくなります。初期値はFalseに設定されています。
GlobalReplaceメソッドやExecuteメソッドを呼び出すとき、複数マッチを行うかどうかを表すブール値です。Trueに設定された場合、正規表現にマッチするすべての部分に対して検索・置換が行われます。初期値はFalseに設定されています。
MultiLine文字列を複数行として扱うかどうかを表すブール値です。Trueに設定すると、各行の先頭や末尾でも"^"や"$"がマッチするようになります。初期値はFalseに設定されています。
メソッド
メソッド名動作内容
Test(検索文字列)引数として文字列を取り、正規表現とマッチする場合はTrueを返し、一致しない場合はFalseを返します。
Replace(検索文字列, 置換文字列)引数として2つの文字列を取ります。検索文字列の中で正規表現のマッチに成功すると、そのマッチしたものを置換文字列に置き換えて、新しい文字列を返します。マッチするものが見つからなかった場合は、元の検索文字列が返されます。
Execute(検索文字列)検索文字列から正規表現とマッチする部分を検索し、検索結果を Matche オブジェクトを含むMatchesコレクションとして返します(詳細は後述)。

 以下にサンプルをいくつか挙げておきます。

Testメソッドの使用例
Dim re As RegExp

Set re = New RegExp
re.Pattern = "^[0-9]+$" '数字のみの文字列を表す正規表現
MsgBox re.Test("01234") 'True
MsgBox re.Test("01A34") 'False
Replaceメソッドの使用例
Dim re As RegExp

Set re = New RegExp
re.Pattern = "[A-Za-z]+" 'アルファベットの連続を表す正規表現
MsgBox re.Replace("私はMikeです。", "マイク") '私はマイクです。
IgnoreCaseプロパティの使用例
Dim re As RegExp

Set re = New RegExp
re.Pattern = "ABCDEFG"
MsgBox re.Test("AbCdEfG") 'False
re.IgnoreCase = True
MsgBox re.Test("AbCdEfG") 'True
Globalプロパティの使用例
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
MultiLineプロパティの使用例
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つのプロパティを持ちます。

Matchesコレクションのプロパティ
プロパティ名設定内容
Countコレクション内に含まれる Match オブジェクトの数を表す読み取り専用の値です。
Itemコレクション内に含まれる Match オブジェクトへアクセスするための読み取り専用の値です。Item(n)のような形でアクセスします。n は0から Count - 1の値を取るインデックス値です。
Matche オブジェクトのプロパティ
プロパティ名設定内容
FirstIndexマッチした部分の位置を表す読み取り専用の値です。検索文字列の最初の位置を0とするオフセット値です。
Lengthマッチした文字列の長さを表す読み取り専用の値です。
Valueマッチした文字列を表す読み取り専用の値です。Matche オブジェクトの既定値になっているので、特にプロパティを指定しない場合はこの値を返します。
SubMatchesマッチした文字列の中で、"( )"でグループ化した部分へアクセスするためのSubMatchesコレクションを返します。SubMatches(n)のような形でアクセスします。nは0から始まるインデックス値です。SubMatches.Countでグループ数を返します。

 以下にサンプルをいくつか挙げておきます。

Executeメソッドの使用例(その1)
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ステートメント"を使って以下のように書き換えることもできます。

Executeメソッドの使用例(その2)
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プロパティの使用例を挙げておきます。

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2007/10/27 17:16 2007/10/27 "[ ]"の説明を訂正

著者プロフィール

あなたにオススメ

All contents copyright © 2005-2022 Shoeisha Co., Ltd. All rights reserved. ver.1.5