Excel VBAで正規表現を使って文字列をマッチさせる方法
Excel VBAで正規表現を使って文字列をマッチさせる方法を紹介します。
1.はじめに
Excel VBAでは正規表現による文字列マッチを行うことが可能ですが、PHPやPerlなどより、お作法がちょっと面倒です。
また、ネットで検索してもパッとみて分かるようなサンプルがなかったので、できるだけ無駄なものを省いたサンプルを使って本エントリーで説明してみたいと思います。
2.文字列をマッチさせるサンプル
正規表現を使って文字列をマッチさせるサンプルは次のとおりです。
Sub test()
Dim str As String
str = "foo bar hoge"
Dim regex
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "\s\w+\s"
Dim result
Set result = regex.Execute(str)
If result.Count > 0 Then
MsgBox result(0)
End If
Set regex = Nothing
End Sub
解説です。
まず検索対象の文字列を作ります。ここでは「foo bar hoge」とします。
Dim str As String
str = "foo bar hoge"
次に正規表現のためのオブジェクトを作成します。
Dim regex
Set regex = CreateObject("VBScript.RegExp")
Patternプロパティに、正規表現でマッチさせたいパターンを設定します。
regex.Pattern = "\s\w+\s"
Executeメソッドで文字列マッチを実行します。結果はMatchesコレクションとして返却されます。
Dim result
Set result = regex.Execute(str)
result.CountでMatchオブジェクトの個数が分かります。個数が0以上であればマッチしたことを意味するので、結果を表示します。ここでは「 bar 」がマッチするので、0番目の内容だけを出力します。
If result.Count > 0 Then
MsgBox result(0)
End If
パターンマッチが終わったらオブジェクトへの参照を解除します。
Set regex = Nothing
実行結果のMsgBoxには「 bar 」が表示されます。
3.複数回マッチさせる
2項のサンプルでは、検索文字列にマッチする文字が複数回出現しても1度しかマッチしません。
複数回マッチさせるには、以下の1行を追加します。
regex.Global = True
サンプルの正規表現や実行結果部分も複数マッチに対応できるよう変更します。追加・変更部分を赤色で示します。
Sub test()
Dim str As String
str = "foo bar hoge"
Dim regex
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "\w+"
regex.Global = True
Dim result
Set result = regex.Execute(str)
If result.Count > 0 Then
For i = 0 To result.Count - 1
MsgBox result(i)
Next
End If
Set regex = Nothing
End Sub
実行結果のMsgBoxには「foo」「bar」「hoge」が表示されます。
4.大文字・小文字を区別する
大文字・小文字を区別するには以下の1行を追加します。
regex.IgnoreCase = True
サンプルの検索対象の文字列を「foo Foo FOO」に変更してマッチ文字列を「foo」にします。追加・変更部分を赤色で示します。
Sub test()
Dim str As String
str = "foo Foo FOO"
Dim regex
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "foo"
regex.Global = True
regex.IgnoreCase = True
Dim result
Set result = regex.Execute(str)
If result.Count > 0 Then
For i = 0 To result.Count - 1
MsgBox result(i)
Next
End If
Set regex = Nothing
End Sub
実行結果のMsgBoxには「foo」「Foo」「FOO」が表示されます。