RegExp オブジェクトの生成

VBA — RegExp 生成(レイトバインディング)
Option Explicit

Function CreateRegExp(ByVal pattern As String, _
                      Optional ByVal ignoreCase As Boolean = False, _
                      Optional ByVal globalMatch As Boolean = True) As Object
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    re.Pattern    = pattern
    re.IgnoreCase = ignoreCase
    re.Global     = globalMatch
    Set CreateRegExp = re
End Function

プロパティ一覧

プロパティ内容
PatternString正規表現パターン文字列
IgnoreCaseBooleanTrue で大文字小文字を区別しない
GlobalBooleanTrue で全マッチを検索(False は最初の1件のみ)
MultiLineBooleanTrue で ^ / $ が行頭・行末にマッチ

Test — 一致確認

VBA — Test
Sub TestExample()
    Dim re As Object
    Set re = CreateRegExp("^\d{3}-\d{4}$")  ' 郵便番号パターン

    Debug.Print re.Test("123-4567")   ' → True
    Debug.Print re.Test("1234567")    ' → False
    Debug.Print re.Test("abc-1234")   ' → False

    Set re = Nothing
End Sub

Execute — マッチ結果の取得

VBA — Execute でメールアドレスを抽出
Sub ExecuteExample()
    Dim re      As Object
    Dim matches As Object
    Dim m       As Object

    Set re = CreateRegExp("[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}")

    Dim text As String
    text = "連絡先: foo@example.com または bar@test.co.jp"

    Set matches = re.Execute(text)

    For Each m In matches
        Debug.Print m.Value   ' → foo@example.com / bar@test.co.jp
    Next m

    Set matches = Nothing
    Set re = Nothing
End Sub

Replace — 置換

VBA — Replace で数字をマスク
Sub ReplaceExample()
    Dim re     As Object
    Set re = CreateRegExp("\d+")   ' 数字列にマッチ

    Dim result As String
    result = re.Replace("注文番号 12345 の金額は 9800 円", "***")
    Debug.Print result   ' → 注文番号 *** の金額は *** 円

    Set re = Nothing
End Sub

よく使うパターン集

用途パターン
整数^\d+$
小数^\d+(\.\d+)?$
郵便番号^\d{3}-\d{4}$
電話番号(ハイフンあり)^\d{2,4}-\d{2,4}-\d{4}$
メールアドレス(簡易)^[^\s@]+@[^\s@]+\.[^\s@]+$
日付(yyyy/mm/dd)^\d{4}/\d{2}/\d{2}$
HTMLタグ除去<[^>]+>
連続スペース正規化\s+(置換先: " ")

まとめ

VBScript.RegExp を使うと、Like 演算子では困難な複雑なパターンマッチングが実現できます。レイトバインディングで参照設定不要のため配布物にも使いやすい点が魅力です。

次の章では…

PART 10 では ファイル操作 を解説します。FileSystemObject と旧来の Open 文の違い、フォルダ再帰処理のパターンを紹介します。

→ PART 10 — ファイル操作へ