ここでは、正規表現の詳しい内容について触れる前に、比較的簡単な使用例をみてみます。
例1:ダイアログに入力された文字列内の半角数字の有無を判定する
インプットボックス関数を用いて文字列を入力させ、半角文字が含まれているかどうかを判定してメッセージを返します。
標準モジュールに次のように記せば完成です。
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がパターンにマッチするかどうか(半角数字が含まれているかどうか)を判定し、結果をメッセージボックスで表示しています。
これを実行して「4980」という半角数字を含む文字列を入力してOKしてみます。
半角数字が含まれているものと判定されました。
例2:半角数字をすべて置き換えるユーザー定義関数
このようなテーブルがあります。
ユーザー定義関数とクエリにより、コメント列に含まれる半角数字をすべて「*」に置き換えてみます。
標準モジュールに次のように記します。
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]"を設定しています。
クエリのデザインビューに上記のテーブルを置き、次のような列を設けます。
数字伏せコメント: reg_replace([コメント])
データシートビューで開いた結果です。全角数字や漢数字等はそのままですが、半角数字のみがすべて「*」に置き換えられています。
標準のReplace関数でやると10回ネストしなければなりませんが、この方法なら記述をだいぶシンプルにすることができます。
参考:参照設定と事前バインド
さて、RegExpオブジェクトの生成についてですが、上記の例のようにCreateObject関数を用いる方法は「遅延バインド(バインディング)」と呼ばれます。
一方で「事前バインド(バインディング)」と呼ばれる方法もあります。
事前バインドのデメリットはあらかじめ参照設定をしておく必要があることですが、速度面で有利なことと、コードの記述中にプロパティ等の自動補完がはたらくことがメリットとなっています。
事前バインドの手順です。
VBEウインドウの上部にあるメニューから「ツール」→「参照設定」と選択し、一覧から「Micrpsoft VBScript RegularExpressions 5.5」にチェックを入れてOKします。
あとはコード中のDim,Set文によるオブジェクト生成の例として、次のようにすればOKです。
Dim reg_exp As RegExp Set reg_exp = New RegExp
なお、以下の記事では基本的に遅延バインドを用います。