最短一致
正規表現での文字列比較は、デフォルトでは最長一致になっていますが、量指定子("*"、"+"、"{}"等)の後に"?"を付けることで最短一致に変更できます。
以下にサンプルを挙げておきます。
Dim re As RegExp Set re = New RegExp re.Pattern = "あ.+お" '"あ"で始まり"お"で終わる文字列を表す '正規表現(最長一致) '文字列全体とマッチする MsgBox re.Replace("あいうえおあいうえおあいうえお", "AIUEO") re.Pattern = "あ.+?お" '"あ"で始まり"お"で終わる文字列を表す '正規表現(最短一致) '最初の"あいうえお"のみマッチする。 MsgBox re.Replace("あいうえおあいうえおあいうえお", "AIUEO")
後方参照
後方参照を使うと、"( )"でグループ化した文字列を再度利用することができます。
Testメソッドなどで、正規表現を定義するときに後方参照を利用する場合は、"\"文字の後にグループの番号を数字でを指定します。
Replaceメソッドなどで、置換文字列を指定するときに後方参照を利用する場合は、"$"文字の後にグループの番号を数字でを指定します。
以下のサンプルを参考にしてください。
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
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
それでは。
参考資料
- なかま's HP『サルにもわかる正規表現入門』
- Wendy's Microsoft Office Note『文字列の操作1』
- PHP で WEB作成『最短一致と最長一致』
- MSDN『Clinick's Clinic on Scripting: 正規表現による Visual Basic Scripting Edition (VBScript) の機能強化』
- MSDN『RegExp オブジェクト』
- MSDN『Matches コレクション』
- MSDN『Match オブジェクト』
- MSDN『SubMatches コレクション』