コピペで使えるVBA!IPアドレスを正規表現で判定する

VBA

IPアドレスを判定したいけど毎回正規表現を書いていられないのでメモとして残しておく。

正規表現

^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

解説

第一オクテット

^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

第一オクテットの数字から開始させたいので開始を表す「^」を入れる

^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

左から1桁の場合、2桁の場合、3桁で100〜199まで、3桁で200〜249、3桁で250〜255までの5パターンのどれかに一致するように設定

[1-9] | [1-9][0-9] | 1[0-9][0-9] | 2[0-4][0-9] | 25[0-5]

ドット

^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

ドットはメタ文字でそのままだと任意の1文字として扱われるのでバックスラッシュで打ち消す。

\.

第二オクテット〜第三オクテット

^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

第一オクテットとドットの組み合わせをセットにしてそれを3回繰り返すように指定する。

繰り返す内容

([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.)

第四オクテット

^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

第四オクテットは最後にドットがつかないので繰り返しはできないため、改めて第一オクテットと同じ内容を記載する。

^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

第四オクテットの数字で終了させたいので終了を表す「$」を記載する。

コード

Sub IPアドレス判定()
    IPリスト = Array("192.168.10.1", "192.168.10.0", "192.168.10.255", "192.168.10.256")
    Set RE = CreateObject("VBScript.RegExp")
    RE.Pattern = "^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$"
    RE.Global = True
    For Each IP In IPリスト
        Set 結果 = RE.Execute(IP)
        If 結果.Count > 0 Then
            Debug.Print IP & "はIPアドレス表記です。"
        Else
            Debug.Print IP & "はIPアドレス表記ではありません。"
        End If
    Next
End Sub

イミディエイト

192.168.10.1はIPアドレス表記です。
192.168.10.0はIPアドレス表記ではありません。
192.168.10.255はIPアドレス表記です。
192.168.10.256はIPアドレス表記ではありません。

最後に

ネットワークの管理など行っているとIPアドレスの判定を行いたいことが多いと思います。
この正規表現で判定してやってください。

コメント

タイトルとURLをコピーしました