?で区切られた文字

ふと思い立って、どのような検索で当HPが閲覧されているのか、「オーガニック検索」の結果を見てみた。するとその中に、
vba 正規表現 ?で区切られた文字列 抽出」
という検索があったので、少しだけ掘り下げてみる。

Split関数の場合

例えば、以下のような文字列があったとする。
「A?B?CDE?F」
これを「?」で区切るのは、Split関数を知っていれば、あまり難しくない。

Sub 区切りテスト()
    Dim str As String
        str = "A?B?CDE?F"
        
    ' ? で区切った文字を格納するための配列。
    Dim seq As Variant
        seq = Split(str, "?")
        
        MsgBox Join(seq, vbNewLine)
End Sub

一旦「?」で寸断して配列に格納。今度は配列を改行(vbNewLine)で結合すると、こうなる。
f:id:Infoment:20190203220447p:plain
ちなみに、区切りとなる「?」が複数連続する場合はどうだろう。
例:str = "A?B??CDE????F"
f:id:Infoment:20190203223100p:plain
律儀に一つずつの「?」で分割しているため、このように何もない行が
「連続する?の数-1」
だけ登場してしまう。この場合、Split関数だけでは上手くいかないようだ。

正規表現の場合

区切り文字としての「?」が1個ずつなら、検索キーワードにある「正規表現」を使うまでもないと思う。だが正規表現でやってみたい等の理由で挑戦するならば、こんな感じか。
※事前にMicrosoft VBScript Regular Expressions 5.5参照済み

Sub 区切りテスト_正規表現()
    Dim str As String
        str = "A?B?CDE?F"
        
    ' 正規表現
    Dim myReg As RegExp
    Set myReg = New RegExp
    ' パターン設定。「?」以外の文字を表す。
        myReg.Pattern = "[^\?]+"
    ' マッチする全ての場合を抽出。
    ' ※一個見つけても中断しない。
        myReg.Global = True
    
    ' strがパターンにマッチするならば、
        If myReg.Test(str) Then
            Dim MatchCases As MatchCollection
    ' マッチするものを全て取得する(マッチコレクション)。
            Set MatchCases = myReg.Execute(str)
            Dim m As Variant
    ' マッチするものを一つずつ取り出して、イミディエイトに表示。
            For Each m In MatchCases
                Debug.Print m
            Next
        End If
End Sub

結果は、↓このようになる。
f:id:Infoment:20190203222745p:plain

こちらも、区切りとなる「?」が複数連続する場合はどうだろう。
例:str = "A?B??CDE????F"
結果は、「?」が一つの場合と同じになる。
f:id:Infoment:20190203223710p:plain
「?以外の文字」で抽出しているのだから、当然と言えば当然か。

ということで、検索して居られた方はきっと、?の個数が複数パターン混在するファイルを受け取っていたに違いない。

既に無事解決されて、いますように。
明日に続きます。

参考まで。