スライドショースライドショー

【VBA入門】正規表現で文字列を抽出、置換する方法(RegExp)

正規表現って使っていますか?正規表現とは、一つの形式パターンでいくつかの文字列をまとめて表現するための表現方法のことです。

たとえば、正規表現の[1-9]という表記は数値の1から9までをまとめて表現しています。[A-Z]という表記はアルファベット大文字のAからZまでをまとめて表現しています。

この正規表現を使って、正規表現の形式パターンにあった文字列を別の文字列に置換したり、マッチングして文字の位置を取得するなどの文字列の操作がVBAでは可能です。

この記事では、正規表現を使った文字列の操作について

  • 正規表現とは
  • RegExpオブジェクトの使い方

という基本的な内容から、

  • Replaceメソッドで置換
  • Executeメソッドでマッチング

など具体的な内容についても解説していきます。

今回は正規表現を使った文字列の操作について、使い方をわかりやすく解説します!

正規表現とは

正規表現とはいくつかの文字列を一つの形式でまとめて表現するための表現方法のことです。主な正規表現については下記のとおりになります。

正規表現:

記号記号の説明例の説明
.任意の1文字。改行文字は除く。.+任意の文字列
*直前の1文字の0回以上の繰り返しと一致hoge*hogeもしくはhogee...と一致
^行の先頭^[0-9]行頭が数字
$行の末尾^.{10}$10文字の行
[ ]カッコ内の任意の1文字と一致。「-」で範囲指定可。[a-z]小文字のアルファベット1文字と一致
[^ ]カッコ内の任意の1文字と不一致。「-」で範囲指定可。[^A-Z]大文字のアルファベット以外
+直前の文字の1個以上の繰り返しと一致hoge+hogee...と一致
?直前の文字の0または1文字と一致hoge?eと一致
{ }カッコ内の数値の繰り返しと一致{n}直前の文字のn個の繰り返しと一致
{,n}直前の文字のn個以下の繰り返しと一致
{m,}直前の文字のm個以上の繰り返しと一致
{m,n}直前の文字のm個以上、n個以下の繰り返しと一致
|直前、直後どちらかのパターンに一致hoge|piyohogeまたはpiyo
( )カッコ内をグループ化。マッチした内容は参照可。

RegExpオブジェクトの使い方

VBAで正規表現を使って文字列を操作するためには、VBScriptのRegExpオブジェクトを使用します。RegExpオブジェクトのプロパティとメソッドについて表にまとめます。

プロパティは以下のとおりです。

プロパティ説明
Pattern正規表現で使用するパターンを設定
[1-9]、(やまだ|ヤマダ)などの正規表現パターン
IgnoreCase大文字と小文字を区別しない場合はTrue
デフォルト値はFalse
Global検索対象の文字列内で、文字列全体を検索する場合はTrue
デフォルト値はFalse

これらのプロパティを使って正規表現によるマッチングの設定を行います。

'RegExpオブジェクトの作成
Dim reg As Object
Set reg = CreateObject("VBScript.RegExp")

'正規表現の指定
With reg
    .Pattern = "[0-9]"       'パターンを指定
    .IgnoreCase = False '大文字と小文字を区別するか(False)、しないか(True)
    .Global = True           '文字列全体を検索するか(True)、しないか(False)
End With

メソッドは以下のとおりです。

メソッド説明
Test正規表現によるマッチングを行い、
パターンと一致した場合はTrue
Replace正規表現によるマッチングを行い、
マッチした場合はそのマッチ部分を置換文字列と置換
Executeマッチングの結果をMatchesコレクションで返す

MatchesコレクションはMatchオブジェクトの集合です。Matchesコレクションについては後ほど詳しく解説します。

ReplaceメソッドとExecuteメソッドの使い方について詳しくみていきましょう。

Replaceメソッドで置換

Replaceメソッドは正規表現にマッチした文字列を別の文字列で置換します。

Replaceメソッドは以下のように記述します。

object.Replace(string1, string2)

objectはRegExpオブジェクト名を指定します。

string1は検索および置換の対象となる文字列を指定します。string2は置換するテキスト文字列を指定します。

サンプルコードで使い方を確認しましょう。

Sub macro1()
    'RegExpオブジェクトの作成
    Dim reg As Object
    Set reg = CreateObject("VBScript.RegExp")
    
    '正規表現の指定
    With reg
        .Pattern = "[0-9]"      'パターンを指定
        .IgnoreCase = False     '大文字と小文字を区別するか(False)、しないか(True)
        .Global = True          '文字列全体を検索するか(True)、しないか(False)
    End With
    
    Dim str1 As String, str2 As String
    str1 = "東京1大阪2名古屋3"
    str2 = reg.Replace(str1, ",") '指定した正規表現を第2引数の区切り文字に置換
    
    MsgBox str2
End Sub

実行結果:
RegExp01

このサンプルコードでは、Withステートメント内でRegExpオブジェクトregのプロパティを設定しています。正規表現パターンには数値を指定しています。

これをオブジェクトregから呼び出したReplaceメソッドを使って、文字列str1内の全ての数値を”,”(カンマ)に置換しています。

Executeメソッドでマッチング

Executeメソッドはマッチングの結果をMatchesコレクションで返します。

MatchesコレクションはMatchオブジェクトの集合です。Matchesコレクションのプロパティは以下のとおりです。

プロパティ説明
CountMatchesコレクション内のMatchオブジェクトの個数
Item一般的なコレクションのItemと同様

Matchオブジェクトのプロパティは以下のとおりです。

プロパティ説明
FirstIndex最初にマッチングした位置
Lengthマッチした文字列の長さ
Valueマッチした文字列

Executeメソッドは下記のように記述して使用します。

Dim Matches    ' Variant型を定義
Set Matches = object.Execute(string)

objectはRegExpオブジェクト名を指定します。stringは正規表現による検索の対象となる文字列を指定します。

Executeの使い方をサンプルコードで確認しましょう。

Sub macro2()
    'RegExpオブジェクトの作成
    Dim reg As Object
    Set reg = CreateObject("VBScript.RegExp")
    
    '正規表現の指定
    With reg
        .Pattern = "[エンジニア]"      'パターンを指定
        .IgnoreCase = False     '大文字と小文字を区別するか(False)、しないか(True)
        .Global = True          '文字列全体を検索するか(True)、しないか(False)
    End With
    
    Dim str As String, Matches
    str = "侍エンジニア塾"
    Set Matches = reg.Execute(str) '正規表現でのマッチングを実行
    
    Dim msg As String
    For Each Match In Matches
        msg = msg & Match.Value & " が" & Match.FirstIndex & "文字目に見つかりました" & vbCrLf
        
    Next Match
    
    MsgBox msg
End Sub

実行結果:
RegExp02

このサンプルコードでは、Withステートメント内でRegExpオブジェクトregのプロパティを設定しています。

正規表現パターンには”エ”、”ン”、”ジ”、”ニ”、”ア”のいずれかの文字を指定しています。これをオブジェクトregから呼び出したExcuteメソッドを使って、文字列str内の全ての文字に対してマッチングを行っています。

Excuteメソッドの戻り値はMatchesコレクションに格納され、For Eachステートメントを使ってオブジェクト1つずつにアクセスしています。

MatchオブジェクトのプロパティValueおよびFirstIndexを使って、マッチングした文字列と最初にマッチした位置をそれぞれ取得しています。

まとめ

ここでは、正規表現を使った文字列の置換とマッチングについて説明しました。

RegExpオブジェクトのReplaceメソッドExecuteメソッドを使うことで正規表現を使って文字列を操作することができます。

使いこなすことができるように、この記事を何度も参考にして下さいね!

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説