共通文字を削除 ②
昨日は、文字列内にある共通文字を「意味が通じる範囲に於いて」削除し、文字列全体を短くしてみた。
infoment.hatenablog.com
今日は昨日に引き続き、別パターンの文字列に対応してみる。
今回のパターンは、こんな感じ。
最小値と最大値を、ニョロ(~)でつなぐタイプの人にも対応できるようにする。
ちなみに昨日のパターンは、同じ内容でも、こんな表現だった。
昨日の繰り返しになるが、こういう人も居る。
今回の方針は、以下の通り。
- 正規表現を用いる。
- 一文字以上の英字ののち「-」で繋がれた一桁以上の数字があって、その最小値と最大値が「~」で繋がれている。
- 「~」内に省略された数字は、必ず「連続」している(1,3,5,6のような飛び飛びの値ではない)。
以上を踏まえたコードがこちら。
Sub HogeTest() Dim str As String str = Range("C5").Value ' Microsoft VBScript Regular Expressions 5.5 参照済み。 Dim myReg As RegExp Set myReg = New RegExp ' 後ほど「~」は半角に矯正するため、パターンも「~」としている。 myReg.Pattern = "([A-Z]+)\-(\d+)~([A-Z]+)\-(\d+)" Dim MC As MatchCollection Dim SM As SubMatches ' 大文字と小文字、全角と半角の混在をここで矯正する。 str = StrConv(str, vbNarrow + vbUpperCase) If myReg.test(str) Then Set MC = myReg.Execute(str) Set SM = MC(0).SubMatches Dim Min As Long Min = SM(1) Dim Max As Long Max = SM(3) Dim i As Long Dim v() As Variant ReDim v(Min To Max) For i = Min To Max v(i) = i Next str = SM(0) & "-" & Join(v, ",") End If MsgBox str End Sub
今回も、何とかうまくいったようだ。
そしてまた一つ、運用時のルール不在が温存され、VBAerの例外対応力だけが勢いよく育まれるのでした。
参考まで。