?で区切られた文字
ふと思い立って、どのような検索で当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)で結合すると、こうなる。
ちなみに、区切りとなる「?」が複数連続する場合はどうだろう。
例:str = "A?B??CDE????F"
律儀に一つずつの「?」で分割しているため、このように何もない行が
「連続する?の数-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
結果は、↓このようになる。
こちらも、区切りとなる「?」が複数連続する場合はどうだろう。
例:str = "A?B??CDE????F"
結果は、「?」が一つの場合と同じになる。
「?以外の文字」で抽出しているのだから、当然と言えば当然か。
ということで、検索して居られた方はきっと、?の個数が複数パターン混在するファイルを受け取っていたに違いない。
既に無事解決されて、いますように。
明日に続きます。
参考まで。