【VBA】正規表現(RegExp)を使う方法(パターン一致と置換を説明)
今回はVBAで正規表現を使う方法を紹介します。
この記事では↓の内容が分かります。
- 正規表現とはどのようなものか
- 正規表現によるパターン一致の確認
- 正規表現にマッチした文字列を置換する
- パターン一致した文字列を抽出する
単純なワイルドカードを含めた一致を判定するだけならば、Like演算子を使う方法のがシンプルでおすすめです。
正規表現とは
正規表現とは、ある特定のパターンを持つ文字列を指定する表記法の一つ。文字列の検索や置換、抽出などを行う際の対象の指定などのために用いられる。
出典:IT用語辞典 e-Words
例えば、\dが任意の数字を表したり、\wが任意の文字を表したりします。
また、前方一致や後方一致といった指定の仕方もできます。
なお、VBAで正規表現を使用する場合、VBScript内のライブラリを使用します。参照設定を追加する方法もありますが、今回はCreateObjectで参照する方法でお見せします。
正規表現によるパターン一致の確認(testメソッド)
Sub Sample1()
'RegExpオブジェクトの生成
Dim reg As Object
Set reg = CreateObject("VBScript.RegExp")
With reg
.Pattern = "\d" 'パターン(正規表現)を指定
.IgnoreCase = False '大文字と小文字を区別するか
.Global = True '文字列全体を検索
'パターン一致判定
If .test("123456789a") Then
MsgBox "パターンと一致します"
Else
MsgBox "パターンと一致しません"
End If
End With
End Sub
このサンプルコードを元にパターン一致の確認方法を紹介します。
With reg
.Pattern = "\d" 'パターン(正規表現)を指定
.IgnoreCase = False '大文字と小文字を区別するか
.Global = True '文字列全体を検索
正規表現を使う場合、最初に正規表現のパターンの指定などを行います。
'パターン一致判定
If .test("123456789a") Then
MsgBox "パターンと一致します"
Else
MsgBox "パターンと一致しません"
End If
準備が終わった後、testメソッドを使用してパターン一致の確認をします。
testメソッドは引数がパターンと一致するときはTrueを一致しないときはFalseを返します。
パターン一致を確認したいときはtestメソッドを使うと覚えてください。
.Pattern = "^\d" '前方一致
.Pattern = "\d$" '後方一致
.Pattern = "\d{10}" '連続した数値が10個ある
一度実行してみたら、パターンを↑のように変更して色々と試してみましょう。
何度も試してみると正規表現の理解が深まりますよ。
正規表現にマッチした文字列を置換する(Replaceメソッド)
Sub Sample2()
'RegExpオブジェクトの生成
Dim reg As Object
Set reg = CreateObject("VBScript.RegExp")
With reg
.Pattern = "\d" 'パターン(正規表現)を指定
.IgnoreCase = False '大文字と小文字を区別するか
.Global = True '文字列全体を検索
'文字列を置換
MsgBox .Replace("12a45b78c", "W")
End With
End Sub
正規表現による文字列の置換はReplaceメソッドを使います。
Replaceメソッドは1つ目の引数から、パターンと一致した文字列を、2つ目の引数へ置換します。
サンプルコードではパターンを数値にしているため、文字列内の124578がWに置換されます。
パターン一致した文字列を抽出する方法 (Executeメソッド)
Sub Sample3()
'RegExpオブジェクトの生成
Dim reg As Object
Set reg = CreateObject("VBScript.RegExp")
With reg
.Pattern = "\d" 'パターン(正規表現)を指定
.IgnoreCase = False '大文字と小文字を区別するか
.Global = True '文字列全体を検索
'Executeメソッドでパターン一致した文字列を抽出
'MatchCollection型で結果が得られる
Dim mc As Object, m As Object
Set mc = .Execute("12a45b78c")
'MatchCollectionから1つずつ結果を取り出し
For Each m In mc
'Valueプロパティで一致した文字列を取り出し
Debug.Print m.Value '1 2 4 5 7 8
Next
End With
End Sub
正規表現ではパターンにマッチした文字列を抽出(取り出す)こともできます。
Set mc = .Execute("12a45b78c")
文字列の抽出にはExecuteメソッドを使います。
Executeメソッドを使うとパターン一致した文字列をコレクションの形で取得できます。 (正確にはMatchCollectionといいます)
For Each m In mc
'Valueプロパティで一致した文字列を取り出し
Debug.Print m.Value '1 2 4 5 7 8
Next
パターン一致した文字列を取り出すにはサンプルコードのようにFor Each文を使うかItemメソッドで取り出します。
あとは各パターンに対してValueプロパティを使うことで、一致した文字列を取り出すことができます。
サンプルコードでは「1 2 4 5 7 8」がパターン一致しているため、これらの文字列が順番に表示されます。