VBA全般 正規表現 VBScript.RegExpのクラスモジュール
正規表現の勉強でちょっと停滞気味なので,てこ入れで本を買いました。
反復学習ソフト付き 正規表現書き方ドリル (WEB+DB PRESS plus)
- 作者: 杉山貴章,木本裕紀
- 出版社/メーカー: 技術評論社
- 発売日: 2010/12/22
- メディア: 大型本
- 購入: 3人 クリック: 54回
- この商品を含むブログ (9件) を見る
勉強を進めるにあたり,いちいちコード上で書くのが面倒になりました。
イミディエイトウィンドウでちまちま書きながら試すのはすきなので,いちいち宣言部分や参照設定をしなくてもいいようにラッパークラスみたいなものを作りました。
本題は進んでいませんが,スムーズにやるうえで大事なこと!
WordでもExcelでもPowerpointでも使えるようにしたつもりです。私の環境では使えた。
目次
VBAコード
クラスモジュール
RegExpClass.cls
Option Explicit Private pPattern As String Private pIgnoreCase As Boolean Private pGlobal As Boolean Private pSourceString As String Private pMatchCollection As Object Private pSubMatches As Variant Property Let Pattern_(Optional argIgnoreCase As Boolean = False, Optional argGlobal As Boolean = True, argPattern As String) pPattern = argPattern pIgnoreCase = argIgnoreCase pGlobal = argGlobal End Property Property Let IgnoreCase_(argIgnoreCase_ As Boolean) pIgnoreCase = argIgnoreCase End Property Property Get IgnoreCase_() As Boolean IgnoreCase_ = pIgnoreCase End Property Property Let Global_(argGlobal As Boolean) pGlobal = argGlobal End Property Property Get Global_() As Boolean Global_ = pGlobal End Property Property Let sourceString_(argsourceString As String) pSourceString = argsourceString End Property Property Get sourceString_() As String sourceString_ = pSourceString End Property Property Get MatchCollection_() As Object Set MatchCollection_ = pMatchCollection End Property Property Get SubMatches_() As Variant SubMatches_ = pSubMatches End Property Function Execute_() As String Dim ret As String 'Dim Regex As VBScript_RegExp_55.RegExp 'Set Regex = New VBScript_RegExp_55.RegExp Dim Regex As Object Set Regex = CreateObject("VBScript.RegExp") With Regex .Pattern = pPattern .IgnoreCase = pIgnoreCase .Global = pGlobal Set pMatchCollection = .Execute(pSourceString) End With Dim s For Each s In pMatchCollection ret = ret & "," & IIf(s = "", Chr(34) & Chr(34), s) Next Execute_ = pMatchCollection.Count & "個Hit" & vbCrLf & Mid(ret, 2) If pMatchCollection.Count = 0 Or pMatchCollection(0).SubMatches.Count = 0 Then Erase pSubMatches Exit Function End If ReDim pSubMatches(0 To pMatchCollection.Count - 1, 0 To pMatchCollection(0).SubMatches.Count - 1) As String Dim i As Long: i = 0 Dim j As Long Dim s2 For Each s In pMatchCollection j = 0 For Each s2 In s.SubMatches pSubMatches(i, j) = s2 j = j + 1 Next i = i + 1 Next End Function
標準モジュール
Option Explicit Public RE As RegExpClass Sub test() Set RE = New RegExpClass RE.sourceString_ = "2NaHCO3" RE.Pattern_ = "(\d)?(\w)*" Debug.Print RE.Execute_ End Sub
利用方法
標準モジュール内で書いている通り, sourceString_やPattern_を適切に変え,RE.Execute_を実行する,というのが基本の流れです。
Execute_は元とは少し機能を変えており,文字列で検索結果を吐き出させるように変えています。
また,MatchCollectionについてはプロパティとして取得可能にしています。
SubMatchesにアクセスするのはちょっと面倒だったので,配列に入れなおしてSubMatches_プロパティに入れています。Variant型の二次元配列ですが,うまく使えば中身は見れます。
勉強やSubMatchesを利用する練習にするには,文字列で吐き出させるように作り直せばもっといいのかな。簡単に書きなおせると思います。
自分用ではありますが,一度このクラスモジュールをエクスポートしておけば,たぶんVBAが使えるオフィスソフト上では動くかなぁと思われますし,標準モジュール上でPublic宣言をしているので,ある程度の範囲内ではイミディエイトウィンドウ上でパターンや文字列を変更して値を見ることができます。
標準モジュールのEnd Subにブレークポイントを設定するかその辺にStopを入れておけば内部変数も見れるので勉強に使えるかな。
さぁ正規表現のほうの勉強にモドラナキャ!(;´▽`A``