正規表現を理解しようシリーズ。
バラバラな表記の郵便番号を統一した書式に整える、というのをやってみようと思います。
きれいにしたい対象↓
ちなみに6行目と7行目は郵便番号ではありません。入力ミスのものです。
まず、郵便番号パターンに該当するか、というのを判定してみたいと思います。
RegExpオブジェクトのTestメソッドを利用します。
object.Test(string)
パターンに一致する文字列が検索されたらTrueを返します。
見つからないとFalseを返します。
※引用元
VBAで正規表現を利用する(RegExp)|VBA技術解説 (excel-ubara.com)
まず、正規表現で郵便番号を定義します。
^〒?\d{3}-?\d{4}$
としました。
^〒?
^:で始まる
郵便番号記号で始まる
?:直前の文字が0個か1個
なので、「〒」で始まる、でも「〒」はなくてもよい、ということになります
\d{3}
\d:数字一文字
{3}:直前の文字3文字
なので「数字三文字」、ということになります
-?
「-」ハイフンと?なのでハイフン一文字、もしくはなくてもよい
d{4}$
\d{4}: 数字4文字
$:で終わる
なので数字4文字で終わる、ということ
◆◆◆コード◆◆◆
Dim re As RegExp ’正規表現クラスオブジェクト
Set re = New RegExp
‘検索条件設定
re.Global = True ’検索範囲(True:文字列の最後まで検索)
re.IgnoreCase = True ’大文字小文字の区別(True:区別しない)
re.Pattern = “^〒?\d{3}-?\d{4}$” ’検索パターン”
‘エクセルを走査
‘検索実行
Dim i As Long
For i = 2 To 7
Cells(i, 2).Value = re.test(Cells(i, 1).Value)
Next i
◆◆◆◆◆◆◆◆◆
A列の文字列をテストし、B列にテスト結果を出力しました。
6行目、7行目は違うよ、と出ましたね。
次に、〒XXX-XXXXという形に統一した表現に置換していこうと思います。
RegExpオブジェクトのReplaceメソッドを利用します。
検索パターンの取り出したいところにカッコを付け加えます。
^〒?(\d{3})-?(\d{4})$
カッコに囲まれたところを取り出すことができます。
最初のカッコは$1で取り出せます。
次のカッコは$2で取り出せます。
その次のカッコは$3で(今回はないけど)・・・という風に何番目のカッコを取り出す、という風に指定できます。
Replaceで対象文字列を「〒(取り出した1つ目の文字列)-(取り出した2つ目の文字列)」という形に置換したいので以下のように書きます。
Replace(対象文字列, “〒$1-$2”)
つまり、こうですね。
re.Replace(Cells(i, 1).Value, “〒$1-$2”)
◆◆◆コード◆◆◆
Dim re As RegExp ‘正規表現クラスオブジェクト
Set re = New RegExp
‘検索条件設定
re.Global = True ’検索範囲(True:文字列の最後まで検索)
re.IgnoreCase = True ’大文字小文字の区別(True:区別しない)
re.Pattern = “^〒?(\d{3})-?(\d{4})$” ’検索パターン”
‘置換
For i = 2 To 7
Cells(i, 3).Value = re.Replace(Cells(i, 1).Value, “〒$1-$2”)
Next i
◆◆◆◆◆◆◆◆◆
C列に置換後の郵便番号を出力しました。
6行目、7行目はパターンが一致しなかったので、そのまま出力されちゃってますね。
置換の部分を以下のように変更しました。
赤字部分で「パターンに一致してたら置換して出力する」と条件を追加しました。
◆◆◆コード◆◆◆
‘置換
For i = 2 To 7
If re.test(Cells(i, 1).Value) = True Then
Cells(i, 3).Value = re.Replace(Cells(i, 1).Value, “〒$1-$2”)
End If
Next i
◆◆◆◆◆◆◆◆◆
こうなりました。
ふーむ、勉強になりました。使う機会があるといいな。
お読みいただきありがとうございました!
参考とさせていただいたサイト。ありがとうございました。
コメント