Excel VBAで正規表現のグループ化を使ってマッチ文字列を取得する
Excel VBAで正規表現のグループ化を使って、複数のマッチ文字列を取得する方法を紹介します。
1.はじめに
「Excel VBAで正規表現を使って文字列をマッチさせる方法」では、文字列が正規表現にマッチしたかどうかの判定を行う方法を解説しました。
ただ、実際のプログラムでは判定だけでなく、マッチした文字列を取得して利用するケースが少なくないと思います。
ということで、正規表現のグループ化を使ったマッチ文字列の取得方法を紹介します。
こちらも元記事と同様、ネットで検索しても分かりやすいサンプルがなかったので、できるだけ無駄なものを省いたサンプルを使って説明したいと思います。
2.正規表現のグループ化を使って複数の文字列を取得する
ここでは「2014/02/22 12:34:56」という年月日時分秒を示す文字列から、すべての数字を抜き出すサンプルで解説します。
サンプルコードは次のとおりです。
Sub test()
Dim str As String
str = "2014/02/22 12:34:56"
Dim regex
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "(\d+)/(\d+)/(\d+) (\d+):(\d+):(\d+)"
regex.Global = True
Dim result
Set result = regex.Execute(str)
If result.Count > 0 Then
Set result2 = result(0).SubMatches
For i = 0 To result2.Count - 1
MsgBox result2(i)
Next
End If
Set regex = Nothing
End Sub
以下、解説です。
「Excel VBAで正規表現を使って文字列をマッチさせる方法」と重複する部分については割愛しています。すいませんが元記事の解説を参照してください。
まず検索文字列に「2014/02/22 12:34:56」を設定します。
Dim str As String
str = "2014/02/22 12:34:56"
Patternプロパティに、正規表現でマッチさせたいパターンを設定します。ここでグループ化のためのカッコを付与します。
regex.Pattern = "(\d+)/(\d+)/(\d+) (\d+):(\d+):(\d+)"
Executeメソッドで文字列マッチを実行したあと、結果はMatchesコレクションとして返却されるので、result.CountでMatchオブジェクトの個数を判定します。
If result.Count > 0 Then
…中略…
End If
グループ化で文字列を取得するには、If文の中で、result(0)に対してSubMatchesを実行し、SubMatchesコレクションを取得します。
Set result2 = result(0).SubMatches
SubMatchesコレクションには個別のサブマッチ文字列(ここではマッチした「2014」「02」「22」「12」「34」「56」)が格納されているので、あとはFor文で順番に取得すればOKです。
For i = 0 To result2.Count - 1
MsgBox result2(i)
Next
MsgBoxには「2014」「02」「22」「12」「34」「56」の順で表示されます。