正規表現の使用例

 ここでは、正規表現の詳しい内容について触れる前に、比較的簡単な使用例をみてみます。

例1:ダイアログに入力された文字列内の半角数字の有無を判定する

f:id:accs2014:20190929224701p:plain:right:w450

 インプットボックス関数を用いて文字列を入力させ、半角文字が含まれているかどうかを判定してメッセージを返します。

 標準モジュールに次のように記せば完成です。

Sub reg_test()

    'RegExpオブジェクト生成
    Dim reg_exp As Object
    Set reg_exp = CreateObject("VBScript.RegExp")
    
    'パターン"[0-9]"を設定
    reg_exp.Pattern = "[0-9]"
    
    Dim txt As Variant
    txt = InputBox("文字列を入力してください")

    'パターンに基づきTestメソッドで入力文字列(txt)をチェック、結果表示
    If reg_exp.Test(txt) Then
        MsgBox ("半角数字が含まれています")
    Else
        MsgBox ("半角数字が含まれていません")
    End If

    Set reg_exp = Nothing

End Sub

 最初のDim,Set文により、設定・操作に必要となるRegExpオブジェクト(名前はreg_exp)を生成しています。
 次にPatternプロパティにより、マッチング(判定)に用いる文字列パターン"[0-9]"を設定しています。これは半角数字を意味します。
 そしてInputBox関数を使ってダイアログに文字列を入力させ変数txtに代入します。
 最後にTestメソッドにより変数txtがパターンにマッチするかどうか(半角数字が含まれているかどうか)を判定し、結果をメッセージボックスで表示しています。

f:id:accs2014:20190923160313p:plain:right:w450

 これを実行して「4980」という半角数字を含む文字列を入力してOKしてみます。

f:id:accs2014:20190923160320p:plain:right:w200

 半角数字が含まれているものと判定されました。

例2:半角数字をすべて置き換えるユーザー定義関数

f:id:accs2014:20190923160327p:plain:right:w500

 このようなテーブルがあります。
 ユーザー定義関数とクエリにより、コメント列に含まれる半角数字をすべて「*」に置き換えてみます。

f:id:accs2014:20190929224706p:plain:right:w450

 標準モジュールに次のように記します。

Function reg_replace(arg As Variant) As Variant
    
    'RegExpオブジェクト生成
    Dim reg_exp As Object
    Set reg_exp = CreateObject("VBScript.RegExp")

    'プロパティ設定
    With reg_exp
        .Global = True      '文字列全体を対象とする
        .IgnoreCase = False '大文字と小文字を区別する
        .Pattern = "[0-9]"  'マッチング対象を表すパターン
    End With

    '対象文字列がNullでなければReplaceメソッドで置換実行、戻り値設定
    If IsNull(arg) Then
        reg_replace = Null
    Else
        reg_replace = reg_exp.Replace(Nz(arg), "*")
    End If

    Set reg_exp = Nothing

End Function

 この例ではRegExpオブジェクト(ここでも名前はreg_exp)の3つのプロパティを設定しています。
 Globalプロパティは、マッチした文字列をすべて処理の対象とする(True)か、最初にマッチしたものだけを処理の対象にする(False)かを設定するものです(デフォルトはFalse)。上記の例1ではどっちでも同じ結果になるので設定していませんでしたが、この例では「すべての半角数字を置き換える」ためにTrueに設定する必要があります。
 IgnoreCaseプロパティはマッチングの判定において全角と半角を区別しない(True)か区別する(False)を設定するものです。デフォルトはFalseですがここではあえて明示しています。
 そしてPatternプロパティにより判定に用いる文字列パターン"[0-9]"を設定しています。

f:id:accs2014:20190923160336p:plain:right:w500

 クエリのデザインビューに上記のテーブルを置き、次のような列を設けます。

数字伏せコメント: reg_replace([コメント])

f:id:accs2014:20190923160340p:plain:right:w550

 データシートビューで開いた結果です。全角数字や漢数字等はそのままですが、半角数字のみがすべて「*」に置き換えられています。
 標準のReplace関数でやると10回ネストしなければなりませんが、この方法なら記述をだいぶシンプルにすることができます。

参考:参照設定と事前バインド

 さて、RegExpオブジェクトの生成についてですが、上記の例のようにCreateObject関数を用いる方法は「遅延バインド(バインディング)」と呼ばれます。
 一方で「事前バインド(バインディング)」と呼ばれる方法もあります。
 事前バインドのデメリットはあらかじめ参照設定をしておく必要があることですが、速度面で有利なことと、コードの記述中にプロパティ等の自動補完がはたらくことがメリットとなっています。

f:id:accs2014:20190923160344p:plain:right:w400

 事前バインドの手順です。
 VBEウインドウの上部にあるメニューから「ツール」→「参照設定」と選択し、一覧から「Micrpsoft VBScript RegularExpressions 5.5」にチェックを入れてOKします。

 あとはコード中のDim,Set文によるオブジェクト生成の例として、次のようにすればOKです。

    Dim reg_exp As RegExp
    Set reg_exp = New RegExp

 なお、以下の記事では基本的に遅延バインドを用います。