正規表現は、文字列から特定パターンを「見つける・取り出す・置き換える」ための強力な仕組みです。VBAでは RegExp オブジェクトを使って、複雑な文字列処理をシンプルな記述で実現できます。ここでは実務で使える前提知識から、プロパティ/メソッド、具体例までを一気に整理します。
VBScript 廃止に伴う対応ポイント(VBAの組み込みRegExpの活用)
- Windows環境ではVBScriptが段階的に無効化へ。影響を受けやすいのは「.vbs の呼び出し」や「VBScript.RegExp 参照」。
- Office 365 バージョン 2508 以降は、VBA側に正規表現クラスが標準搭載され、VBScriptに依存せずに利用可能。
- 推奨アクション:
- Officeを最新状態に更新する。
- 外部参照を避け、VBA標準のRegExpを使う方針に切り替える。
- VBScriptを無効化した環境でも動作確認を行い、互換性を担保する。
メタ文字
メタ文字とは「特別な意味」を持つ記号のことです。文字の場所・種類・繰り返し回数・まとまり(グループ)などを表現し、複雑な条件を短く記述できます。
正規表現
カテゴリ | シンボル | 説明 |
---|
位置指定 | ^ | 文字列の先頭にマッチ |
位置指定 | $ | 文字列の末尾にマッチ |
位置指定 | \b | 単語境界にマッチ |
位置指定 | \B | 単語境界以外の位置にマッチ |
リテラル | \n \f \r \t \v | 改行、改ページ、復帰、タブ、縦タブにそれぞれ一致 |
リテラル | \? * + . | { } \ [ \ ] ( ) | 各記号そのものに一致 |
リテラル | \xxx / \xdd / \uxxxx | 8進/16進/Unicodeで指定した文字に一致 |
文字クラス | [xyz] | x,y,z のいずれか1文字に一致 |
文字クラス | [^xyz] | x,y,z 以外の1文字に一致 |
文字クラス | . | 改行以外の任意1文字に一致 |
文字クラス | \w / \W | 英数+アンダーバー/その以外に一致 |
文字クラス | \d / \D | 数字/数字以外に一致 |
文字クラス | \s / \S | 空白(空白・タブ・改行など)/非空白に一致 |
繰り返し | {x} | 直前要素をちょうど x 回 |
繰り返し | {x,} | 直前要素を x 回以上 |
繰り返し | {x,y} | 直前要素を x~y 回 |
繰り返し | ? | 直前要素を 0 または 1 回({0,1}) |
繰り返し | * | 直前要素を 0 回以上({0,}) |
繰り返し | + | 直前要素を 1 回以上({1,}) |
グループ化 | ( ) | 式をひとまとまりにする(入れ子可) |
選択 | | | いずれかの式に一致 |
後方参照 | () と \n | n番目のグループに再一致 |
正規表現RegExpの使い方
VBAで正規表現を使う場合は、RegExpオブジェクトを生成し、Pattern / IgnoreCase / Global を設定してから、Test / Execute / Replace を呼び出します。
RegExpオブジェクト
プロパティ | 概要 |
---|
Pattern | 検索パターンを指定 |
IgnoreCase | 大小文字を区別しない場合は True(既定 False) |
Global | 文字列全体で繰り返し検索する場合は True(既定 False) |
メソッド | 説明 |
---|
Test(string) | 一致があれば True、なければ False を返す |
Replace(string, repl) | 一致部分を置換文字で差し替える |
Execute(string) | 一致した要素の集合(Matches)を返す |
RegExpの使用例
用途 | パターン | 対象 | 判定 |
---|
郵便番号 | \d{3}-\d{4} | 101 | 不一致 |
郵便番号 | \d{3}-\d{4} | 101-101 | 不一致 |
郵便番号 | \d{3}-\d{4} | 101-0011 | 一致 |
メール | [\w.-]+@[\w-]+.[\w.-]+ | abc.def | 不一致 |
メール | [\w.-]+@[\w-]+.[\w.-]+ | abc@def | 不一致 |
メール | [\w.-]+@[\w-]+.[\w.-]+ | abc@def.com | 一致 |
行 | コード(一致判定サンプル) |
---|
1 | Sub SampleMatchTest() |
2 | Dim i As Long |
3 | Dim re As New RegExp |
4 | For i = 2 To 7 |
5 | With re |
6 | .Global = True ‘全体から検索 |
7 | .IgnoreCase = True ‘大文字小文字を無視 |
8 | .Pattern = Cells(i, 2).Value |
9 | Cells(i, 4).Value = IIf(.Test(Cells(i, 3).Value), “OK”, “NG”) |
10 | End With |
11 | Next i |
12 | End Sub |
Matchesコレクション
プロパティ | 内容 |
---|
Count | 一致要素(Match)の個数(読み取り専用) |
Item | 指定インデックスのMatchを取得(読み取り専用) |
Matchオブジェクト
プロパティ | 内容 |
---|
FirstIndex | 元文字列における一致開始位置(0始まり、読み取り専用) |
Length | 一致文字列の長さ(読み取り専用) |
Value | 一致した文字列そのもの(既定値、読み取り専用) |
SubMatchesコレクション
グループ化した括弧内 ( ) に対応する「部分一致」の集合。Match.SubMatches(index) で参照できます。
Execute(Matches / Match / SubMatches)の使用例
文字列を英字ブロックと数字ブロックに分割
行 | コード |
---|
1 | Sub SampleSplitAlphaNum() |
2 | Dim re As New RegExp, mc As MatchCollection, m As Match, i As Long |
3 | re.Pattern = “(\D+)(\d+)” |
4 | re.Global = True |
5 | Set mc = re.Execute(“Abc123DEFGH4567ijkl890”) |
6 | For Each m In mc |
7 | For i = 0 To m.SubMatches.Count – 1 |
8 | Debug.Print m.SubMatches(i) |
9 | Next i |
10 | Next m |
11 | End Sub |
Replaceの使用例
数字以外をすべて削除する
行 | コード |
---|
1 | Sub SampleKeepDigits() |
2 | Dim re As New RegExp |
3 | re.Pattern = “\D” |
4 | re.Global = True |
5 | MsgBox re.Replace(“Abc123DEFGH4567ijkl890”, “”) |
6 | End Sub |
$番号のキャプチャで先頭の英字のみ抽出
行 | コード |
---|
1 | Sub SampleCaptureGroup() |
2 | Dim re As New RegExp |
3 | re.Pattern = “([A-ZA-Z]+)([0-9]+)” |
4 | re.Global = True: re.IgnoreCase = True |
5 | MsgBox re.Replace(“Abc123あいう4567def890”, “$1”) |
6 | End Sub |
先読み:肯定先読み/否定先読み
行 | コード(肯定先読み:アンダースコア直前の連続文字) |
---|
1 | Sub SampleLookaheadPositive() |
2 | Dim re As New RegExp, mc As MatchCollection, m As Match |
3 | re.Global = True |
4 | re.Pattern = “([^]+(?=))” |
5 | Set mc = re.Execute(“abc_def_ghi”) |
6 | For Each m In mc: Debug.Print m.Value: Next m |
7 | End Sub |
行 | コード(否定先読み:直後が数字でない a?c) |
---|
1 | Sub SampleLookaheadNegative() |
2 | Dim re As New RegExp, mc As MatchCollection, m As Match |
3 | re.Pattern = “(a.c(?!\d))” |
4 | re.Global = True |
5 | Set mc = re.Execute(“abc1acc_adc”) |
6 | For Each m In mc: Debug.Print m.Value: Next m |
7 | End Sub |
正規表現の実践例
- 入力検証:郵便番号・電話番号・メールなどのフォーマットチェックに。
- データ整形:余分なスペースや記号の除去、半角/全角の抽出と置換。
- ログ解析:特定パターン(日時・IP・ステータス)の抽出や集計の前処理に。
- 抽出と分割:商品コード・枝番・サフィックスをグループ化して切り出し。
- 置換テンプレ:キャプチャした部分を $1, $2 で再配置して表記ゆれを統一。
正規表現は短い式で強力に動く一方、可読性を損ないやすい側面もあります。パターンは小さく検証しながら育て、コメントとテストデータを必ず残す——これが実務での失敗を減らすコツです。
ABOUT ME