正規表現を扱うRegExpオブジェクト
正規表現とは
正規表現とは、文字列のパターンを表現するための方法です。他の記事でも色々紹介していますが、文字列を検索したり置換したりするときに非常に協力な武器になります。
VBAだけではなく、様々なところで登場しますので覚えといて損はありません(^o^)
正規表現について書いた他の記事
- 【Googleスプレッドシート | EXCELには無いシリーズ】スプレッドシート関数で正規表現使えるよ!
- 【GAS GoogleAppsScript | 基礎コード】正規表現を扱うRegExpオブジェクト・Stringオブジェクト
- 【Googleスプレッドシート | クエリ関数シリーズ6】クエリ関数で正規表現使えんの知ってる?
a~Z、0~9などの通常の文字と、[]や{}などの特殊な役割を持つ「メタ文字」と言う記号の組み合わせでパターンを表現します。
分かりにくいと思うので、早速ですがよく使われる正規表現の記号の一覧です。
よく使われる「正規表現」の記号
記号 | 意味 | 正規表現の例 | マッチする文字列例 |
---|---|---|---|
. | 任意の1文字 | . | a , b, c なんでも |
? | 0回または1回の出現 | ab?cd | acd → 0回 abcd → 1回 |
* | 0回以上の繰り返しの出現 | ab*cd | acd → 0回 abcd → 1回 abbcd → 2回 abbbcd → 3回 abbbb・・・cd → 4回以上何回でも |
+ | 1回以上の繰り返しの出現 | ab+cd | abcd → 1回 abbcd → 2回 abbbcd → 3回 abbbb・・・cd → 4回以上何回でも |
{n} | n回の繰り返しの出現 | ab{3}cd | abbbcd → 3回 |
{n,} | n回以上の繰り返しの出現 | ab{3,}cd | abbbcd → 3回 abbbbcd → 4回 abbbbbcd → 5回 abbbbbb・・・cd → 5回以上何回でも |
{m,n} | n回以上m回以下の繰り返しの出現 | ab{3,4}cd | abbbcd → 3回 abbbbcd → 4回 |
^ | 文字列の先頭 | ^abcd | abcd~ → abcで始まる |
$ | 文字列の末尾 | abcd$ | ~abcd → abcdで終わる |
| | |の左側の文字列もしくは、|の右側の文字列 | a(b|c)d | abd acd |
\w | アルファベット、アンダーバー、数字 | ab\wcd | abgcd ab_cd ab9cd ab[a-zA-Z_0-9]cdと同じ |
\W | アルファベット、アンダーバー、数字以外の文字 | ab\Wcd | abあcd ab青cd ab[^a-zA-Z_0-9]cdと同じ |
\s | 空白文字(半角スペース,タブ,改行,キャリッジリターン) | ab\scd | ab cd ※半角スペース |
\S | 空白文字以外 | ab\Scd | abgcd ab9cd |
\d | 半角数字(0~9) | ab\dcd | ab8cd ab5cd |
\D | 半角数字以外 | ab\Dcd | abmcd abKcd |
[~] | ~のいずれかの1文字 | ab[cde]fg | abcfg abdfg abefg |
[^~] | ~のいずれの1文字にも一致しない | ab[^cde]fg | abafg abbfg abffg ab1fg |
※他にもたくさんありますので興味のある方はググったり本を買ったりして勉強して下さい!
このような、記号を組み合わせて文字列のパターンを作成し、そのパターンにマッチした文字列を検索するために使います。
要するに、「超便利なあいまい検索」って感じですね^_^
RegExpオブジェクト
それでは、VBAから正規表現を利用して文字列を検索する方法を紹介します。
RegExpオブジェクトというオブジェクトを利用します。
RegExpオブジェクト というのは上記で説明したような、正規表現を扱うオブジェクトです。
では早速と行きたいところなんですが、実はRegExp オブジェクト は、VBScriptのオブジェクトになります。
ですのでVBAから利用する場合には、先に”CreateObject関数”を使ってオブジェクトを作ってやる必要があります。
引数の”Class”には、作成するオブジェクトのクラスとアプリケーション名を指定します。
ちょっと分かりにくい表現ですが、呼び出したいものによって書き方が決まってますので、あまり難しく考えなくていいかと思います。
VBScriptのRegExpオブジェクトを作成するには次のようにします。
こんな感じです。
これでオブジェクトを作成しているので、後で使いやすいようにオブジェクト型の変数に格納しちゃいましょう!
Sub sample()
'RegExpオブジェクトを格納する変数を準備
Dim reg As Object
'変数にRegExpオブジェクトを格納
Set reg = CreateObject("VBScript.RegExp")
End Sub
Testメソッド
準備が出来ましたので次のサンプルシートで試していきましょう!
タイトル列にある文字列を正規表現でチェックして、マッチ結果を表示します。
コードは次のようになります。
Sub sample()
'RegExpオブジェクトを格納する変数を準備
Dim reg As Object
'変数にRegExpオブジェクトを格納
Set reg = CreateObject("VBScript.RegExp")
'検索する正規表現のパターンをセット
reg.Pattern = "^VBA" '…VBAで始まる正規表現
'セル(1列目)を検索して結果を2列目に入力
Dim i As Long
For i = 2 To 12
Cells(i, 2) = reg.Test(Cells(i, 1))
Next
End Sub
reg.Pattern = "^VBA"
のところで検索する正規表現をセットしています。
”^VBA”がVBAで始まる文字列という意味の正規表現になります。
Dim i As Long
For i = 2 To 12
Cells(i, 2) = reg.Test(Cells(i, 1))
Next
の部分で、文字列をチェックしています。
Testメソッドでチェックします。
の形で、マッチしていたらTrue、していなければFalseが返ります。
その結果を、直接2列目のセルに入力しています。
では、実行してみましょう!
正しくマッチ結果が返されましたね(^o^)
基本はこれですが、他にも便利なメソッドが用意されています。
メソッドやプロパティ一覧
メソッド名 | 書式 | 引数・戻り値 |
---|---|---|
Testメソッド | object.Test ( string ) | object…対象となる RegExpオブジェクト string … 正規表現にで検索したい文字列 戻り値 … ブール型(Boolean) 一致する文字列が見つかるとTrue、見つからないとFalse |
Replaceメソッド | object.Replace ( string1, string2 ) | object … 対象となるRegExpオブジェクト string1 … 検索・置換の対象となるテキスト文字列 string2 … 置換するテキスト文字列 戻り値 … 正規表現で検索し、マッチした文字列をstring2で指定した文字列に置き換えた文字列。マッチするものが見つからなかった場合は、string1を返します。 |
Executeメソッド | object.Execute ( string ) | object … 対象となるRegExpオブジェクト string … 正規表現による検索の対象となるテキスト文字列 戻り値 … Matchesコレクション |
Replaceメソッド
正規表現で検索して、マッチした文字列を別の文字列に置き換えをします。
VBAかEXCEL、いずれかの文字列を”エクセル”に置き換えします。
Sub sample()
'RegExpオブジェクトを格納する変数を準備
Dim reg As Object
'変数にRegExpオブジェクトを格納
Set reg = CreateObject("VBScript.RegExp")
'検索する正規表現のパターンをセット
reg.Pattern = "VBA|EXCEL" 'VBAかEXCEL
'セル(1列目)を検索して結果を2列目に入力
Dim i As Long
For i = 2 To 12
Cells(i, 2) = reg.Replace(Cells(i, 1), "エクセル")
Next
End Sub
Cells(i, 2) = reg.Replace(Cells(i, 1), "エクセル")
この部分ですね。
マッチする文字列があれば”エクセル”に置き換えます。
Executeメソッド
Matchesコレクション
Matchesコレクションのプロパティなど
プロパテ等 | 書式 | 引数・戻り値 |
---|---|---|
Count プロパティ | object.Matches.Count | object … 対象となるRegExpオブジェクト 戻り値 … Executeメソッドにより取得したMatcheオブジェクトの数 |
Item プロパティ | object.Matches[.Item](number) | object … 対象となるRegExpオブジェク number … インデックス値(0 からMatches.Count–1までの数値) 戻り値 … Executeメソッドにより取得したMatcheオブジェクト |
Matche オブジェクトのプロパティ等
プロパテ等 | 書式 | 引数・戻り値 |
---|---|---|
FirstIndexプロパティ | object.FirstIndex | object … 対象となるMatcheオブジェクト 戻り値 … 検索文字列の最初の位置を0とするオフセット値 |
Lengthプロパティ | object.Length | object… 対象となるMatcheオブジェクト |
Valueプロパティ | object.Value | object … 対象となるMatcheオブジェクト |
SubMatchesコレクション | object.SubMatches(number) | object … 対象となるMatcheオブジェクト number … 0以上SubMatches.Count -1までのインデックス値 戻り値 … SubMatchesコレクション。SubMatchesコレクションの各項目は、正規表現によって検索および取得される文字列です。 |
各メソッドの使い方は、おいおい追記していきます(^o^)
コメント