インストールレスプログラミング( ´ー`)

VBA , JavaScript , HTAなど 365アプリはインストール必要ですが、仕事に無いケースはほぼないから(・_・;)

VBA全般 正規表現 VBScript.RegExpのクラスモジュール

正規表現の勉強でちょっと停滞気味なので,てこ入れで本を買いました。

反復学習ソフト付き 正規表現書き方ドリル (WEB+DB PRESS plus)

反復学習ソフト付き 正規表現書き方ドリル (WEB+DB PRESS plus)

勉強を進めるにあたり,いちいちコード上で書くのが面倒になりました。

イミディエイトウィンドウでちまちま書きながら試すのはすきなので,いちいち宣言部分や参照設定をしなくてもいいようにラッパークラスみたいなものを作りました。

本題は進んでいませんが,スムーズにやるうえで大事なこと!

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宣言をしているので,ある程度の範囲内ではイミディエイトウィンドウ上でパターンや文字列を変更して値を見ることができます。
f:id:chemiphys:20170311225841p:plain

標準モジュールのEnd Subにブレークポイントを設定するかその辺にStopを入れておけば内部変数も見れるので勉強に使えるかな。

さぁ正規表現のほうの勉強にモドラナキャ!(;´▽`A``