SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

VBAで正規表現を使う

RegExpオブジェクトの利用

最短一致

 正規表現での文字列比較は、デフォルトでは最長一致になっていますが、量指定子("*"、"+"、"{}"等)の後に"?"を付けることで最短一致に変更できます。

 以下にサンプルを挙げておきます。

最短一致の例
Dim re As RegExp
Set re = New RegExp

re.Pattern = "あ.+お" '"あ"で始まり"お"で終わる文字列を表す
                      '正規表現(最長一致)

'文字列全体とマッチする
MsgBox re.Replace("あいうえおあいうえおあいうえお", "AIUEO") 

re.Pattern = "あ.+?お" '"あ"で始まり"お"で終わる文字列を表す
                       '正規表現(最短一致)
'最初の"あいうえお"のみマッチする。
MsgBox re.Replace("あいうえおあいうえおあいうえお", "AIUEO") 

後方参照

 後方参照を使うと、"( )"でグループ化した文字列を再度利用することができます。

 Testメソッドなどで、正規表現を定義するときに後方参照を利用する場合は、"\"文字の後にグループの番号を数字でを指定します。

 Replaceメソッドなどで、置換文字列を指定するときに後方参照を利用する場合は、"$"文字の後にグループの番号を数字でを指定します。

 以下のサンプルを参考にしてください。

Testメソッドで後方参照を使用した例
Dim re As RegExp

Set re = New RegExp
re.Pattern = "(.+)\1" '同じ文字列の繰り返しを表す正規表現

MsgBox re.Test("ABCABC") 'True
MsgBox re.Test("ABCDEF") 'False
MsgBox re.Test("わんわん") 'True
MsgBox re.Test("にゃんにゃん") 'True
MsgBox re.Test("コケコッコー") 'False
Replace()メソッドで後方参照を使用した例
Dim re As RegExp

Set re = New RegExp
re.Pattern = "(.+)\s(.+)" '氏名を表す正規表現
                          '姓と名をそれぞれグループ化する

'後方参照で姓と名をひっくり返す
MsgBox re.Replace("山田 太郎", "$2 $1") '太郎 山田
MsgBox re.Replace("田中 花子", "$2 $1") '花子 田中
MsgBox re.Replace("山本 一郎", "$2 $1") '一郎 山本

まとめ

 以上で説明を終わりますが、最後にラッパー関数を紹介したいと思います。毎回、RegExpをオブジェクトを作成するのは面倒ですので、実際は以下のような関数を自分のニーズに合わせて自作して利用すると良いでしょう。

検索関数
'[引数]
'RegExpr:正規表現パターン
'InputStr:検索文字列
'[返り値]
'InputStr内にRegExprが見つかった場合:True
'InputStr内にRegExprが見つからなかった場合:False
Function ExecRegExpr(RegExpr As String, InputStr As String) As Boolean
    Dim re As RegExp
    Set re = New RegExp
    re.Pattern = RegExpr
    ExecRegExpr = re.Test(InputStr)
End Function
置換関数
'[引数]
'RegExpr:正規表現パターン
'InputStr:検索文字列
'ReplaceStr:置換文字列
'[返り値]
'InputStr内にRegExprが見つかった場合:ReplaceStrに置き換えた結果を返す
'InputStr内にRegExprが見つからなかった場合
':InputStrに変更を加えずそのまま返す
Function ReplaceRegExpr(RegExpr As String, InputStr As String, ReplaceStr As String) As String
    Dim re As RegExp
    Set re = New RegExp
    re.Pattern = RegExpr
    re.Global = True
    ReplaceRegExpr = re.Replace(InputStr, ReplaceStr)
End Function

 それでは。

参考資料

  1. なかま's HP『サルにもわかる正規表現入門
  2. Wendy's Microsoft Office Note『文字列の操作1
  3. PHP で WEB作成『最短一致と最長一致
  4. MSDN『Clinick's Clinic on Scripting: 正規表現による Visual Basic Scripting Edition (VBScript) の機能強化
  5. MSDN『RegExp オブジェクト
  6. MSDN『Matches コレクション
  7. MSDN『Match オブジェクト
  8. MSDN『SubMatches コレクション
修正履歴

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
特集記事連載記事一覧

もっと読む

この記事の著者

さなみ(サナミ)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1655 2007/10/27 17:18

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー