VBA 正規表現(Regex)
In this Article
このチュートリアルでは、VBAで正規表現(Regex)を使用する方法について説明します。
Regexとは?
Regexは正規表現の略です。正規表現とは、一連の文字で構成されたパターンのことで、これを使用して別の文字列の中から一致するパターンを見つけることができます。VBAでRegexを使用するには、RegExpオブジェクトを使用する必要があります。
[A-C]のようなパターンは、AからCまでの連続する大文字のアルファベットから検索し、マッチングさせるために使用することができます。Regexパターンには独自の構文があり、文字や文字列を使用して作成することができます。
マッチする文字
以下の表は、Regexパターンを構築するための構文です。
パターンの構文 | 説明 | 例 | マッチする文字列 |
---|---|---|---|
. | vbNewLine 以外の任意の1文字にマッチする | f.n | fan, fon, f@n, fwn |
[characters] | 大括弧[]で囲まれた任意の一文字にマッチする | [fn] | “fan”の”f”または “n”にのみマッチする |
[^characters] | 大括弧[]で囲まれていない任意の1文字にマッチする | [fn] | “fjn”の”j”にマッチする |
[start-end] | 大括弧[]の範囲に含まれる任意の文字にマッチする | [1-5] | “45”の”4″と”5″にマッチする |
\w | 英数字とアンダースコアにマッチし、空白文字にはマッチしない | \w | “,c.” の “c” にマッチする |
\W | 英数字以外の文字とアンダースコアにマッチする | \W | bb@bb “の”@”にマッチする |
\s | スペースやタブなどの空白文字にマッチする | \s | “This is”の” “にマッチする |
\S | 空白文字以外の文字にマッチする | \S | “T h”の”T”と”h”にマッチする |
\d | 任意の数字1桁にマッチする | \d | “a7h”の”7″にマッチする |
\D | 数字以外の任意の1文字にマッチする | \D | “47j”の”j”にマッチする |
\ | 特殊文字をエスケープして、検索できるようにする | \. | “59.pQ”の”.”にマッチする |
\t | タブ | \t | タブ文字にマッチする |
\r | キャリッジリターン | \r | キャリッジリターン(vbCr)にマッチする |
\n | vbNewLine(vbTab) | \n | 改行にマッチする |
量的要素
文字列に対してパターンを何回マッチさせるかを指定するために、量詞を使用することができます。
量記号 | 説明 | 例 | マッチする文字列 |
---|---|---|---|
* | 0回以上の繰り返しにマッチします | fn*a | fna, fa, fnna, fnnna, fnfnnna |
+ | 1回以上の繰り返しにマッチする | fn+a | fna, fnna, fnfnna |
? | 0または1個にマッチする | fn?a | fa, fna |
{n} | n 回に相当する回数 | d\W{4} | d….&5hi “の “d…. “にマッチする |
{n,} | 少なくとも”n”回の繰り返しにマッチする | d\W{4,} | d….&5hi “の “d….&”にマッチする |
{n,m} | n回からm回の繰り返しにマッチする | d\W{1,8} | d….&&&&5hi” の “d….&&&&” にマッチする |
グループ化
グループ化またはキャプチャリングは、パターンを使って文字列の一部をキャプチャして抽出することができます。つまり、パターンにマッチするだけでなく、パターンにマッチした文字列の一部がキャプチャし、再利用することが可能となります。
パターン | 説明 | 例 | マッチする文字列とキャプチャ |
---|---|---|---|
(式) | 括弧内のパターンをグループ化し、キャプチャする | (\W{4}) | “1@@@@1jlmba”から”@@@@”をグループ化してキャプチャします。 |
VBAで正規表現を使うには
VBAでRegexを使うには、まずVBEエディターで参照設定でライブラリを選択する必要があります。VBEエディターで、ツール > 参照設定 > Microsoft VBScript Regular Expressionsと進みます。
これらは、RegExpオブジェクトのプロパティです。
- Pattern – 文字列に対するマッチングに使用するパターンです。
- IgnoreCase – Trueの場合、マッチングでは文字の大文字と小文字が無視されます。
- Global – Trueの場合、文字列中のパターンにマッチするものがすべて検出されます。Falseの場合は、最初のマッチングのみが検出されます。
- MultiLine – Trueの場合、パターンマッチは改行をまたいで行われます。
これらはRegExpオブジェクトのメソッドです。
- Test – 文字列内のパターンを検索し、一致するものがあれば True を返します。
- Replace – パターンの出現箇所を置換文字列で置き換えます。
- Execute – 文字列に対するパターンのマッチを返します。
パターンが文字列と一致するかどうかをテストする
Testメソッドを使うと、あるパターンが入力文字列中のあるシーケンスにマッチするかどうかを確認することができます。結果は、マッチした場合はTrueになります。次のコードでは、文字列に対してパターンをテストする方法を説明します。
Sub RegexTestingAPattern()
Dim stringOne As String
Dim regexOne As Object
Set regexOne = New RegExp
regexOne.Pattern = "f....a"
stringOne = "000111fjo88a8"
Debug.Print regexOne.Test(stringOne)
End Sub
その結果こうなります。
文字列のパターンを置き換える
Replaceメソッドを使用すると、文字列内の一致するパターンの最初のインスタンス、または文字列内の一致するパターンのすべてのインスタンスを置き換えることができます。GlobalがFalseに設定されている場合は、最初のインスタンスのみが置き換えられます。次のコードは、文字列内のパターンを置換する方法を示しています。
Sub RegexReplacingAPattern()
Dim stringOne As String
Dim regexOne As Object
Set regexOne = New RegExp
regexOne.Pattern = "This is the number"
regexOne.Global = False
stringOne = "This is the number 718901"
Debug.Print regexOne.Replace(stringOne, "This is the new number")
End Sub
その結果はこうなります。
上記で使用した文字列の番号部分のみを置換する場合は、以下のようなコードになります。
Sub RegexReplacingAPattern()
Dim stringOne As String
Dim regexOne As Object
Set regexOne = New RegExp
regexOne.Pattern = "[^\D]+"
regexOne.Global = False
stringOne = "This is the number 718901"
Debug.Print regexOne.Replace(stringOne, "777192")
End Sub
その結果こうなります。
文字列中の特定のパターンのインスタンスをすべて置き換えるには、グローバル値をTrueに設定します。次のコードは、文字列内のすべての -A1289C- のインスタンスを置換する方法を示しています。
Sub RegexReplacingEveryInstanceOfAPattern()
Dim stringOne As String
Dim regexOne As Object
Set regexOne = New RegExp
regexOne.Pattern = "╱WA╱d+C╱W"
regexOne.Global = True
stringOne = "ABC-A1289C-ABC-A1289C-ABC"
Debug.Print regexOne.Replace(stringOne, "IJK")
End Sub
文字列中のパターンにマッチして表示する
Executeメソッドを使用すると、文字列内のパターンの1つまたはすべてのインスタンスにマッチさせることができます。次のコードは、文字列からパターンのすべてのインスタンスにマッチして表示する方法を示しています。
Sub RegexMatchingAndDisplayingAPattern()
Dim stringOne As String
Dim regexOne As Object
Dim theMatches As Object
Dim Match As Object
Set regexOne = New RegExp
regexOne.Pattern = "A.C"
regexOne.Global = True
regexOne.IgnoreCase = True
stringOne = "ABC-A1289C-ADC-A1289C-AJC"
Set theMatches = regexOne.Execute(stringOne)
For Each Match In theMatches
Debug.Print Match.Value
Next
End Sub
結果はこうなります。
例えば、上の文字列から-ADC-だけをマッチングさせたいとします。次のコードは、文字列から -ADC- だけをマッチさせて表示する方法を示しています。
Sub RegexMatchingAndDisplayingAPattern()
Dim stringOne As String
Dim regexOne As Object
Dim theMatches As Object
Dim Match As Object
Set regexOne = New RegExp
regexOne.Pattern = "\-\A.C\-"
regexOne.Global = False
regexOne.IgnoreCase = True
stringOne = "ABC-A1289C-ADC-A1289C-AEC"
Set theMatches = regexOne.Execute(stringOne)
For Each Match In theMatches
Debug.Print Match.Value
Next
End Sub
Regexは習得に時間がかかりますが、文字列を識別したり操作したりするための非常に強力なツールです。また、プログラミング言語の枠を超えて広く使われています。