2014/08/30

【C#】IPアドレスの有効性チェックと注意すべき点

入力されたIPアドレスが正しいかどうかという有効性チェックが必要になり、いろいろ調べてみた。
入力された値が「0 ≦ n ≦ 255」でコンマは3つあって…なんてif文で書くのは馬鹿らしいので今すぐやめよう!




IPAddress.TryParseメソッド


MailAddressクラスもあることだし、IPAddressクラスだってあるだろうと思ったらホントにあったやつ。

チェックの定番「TryParse」を使って有効性チェックを行う。
これを実装すると以下のようになる。

string input = Console.ReadLine();
System.Net.IPAddress address;

if (System.Net.IPAddress.TryParse(input, out address))
{
    // IPアドレスとして認識できる
}



みんな大好き、正規表現


次に思いついたチェック方法は、正規表現を使うもの。
実装すると以下のようになる。

using System.Text.RegularExpressions;

string input = Console.ReadLine();

if (Regex.IsMatch(input, @"[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"))
{
    // IPアドレスとして認識できる
}


正規表現の説明

  • [0-9] → 数値かどうか判定する(0~9かどうか)
  • {1,3} → 桁数を判定する(1桁~3桁かどうか)
  • [0-9].[0-9] → 数値の間にピリオドがあるか判定する

これを全部つなげて「[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}」とすれば「0.0.0.0~255.255.255.255」かどうかのチェックができる。



IPアドレスの落とし穴



ちなみにIPアドレスをゼロパディング(ゼロ埋め)するとバグの温床になりかねない。
  • 先頭が0 → 8進数になる
  • 先頭が0x → 16進数になる

192.168.064.1」と入力すると「192.168.52.1」と認識される。
このあたりを注意しないと、リリース後にバグが出たりするので注意。



参考




以上

written by @bc_rikko

1 件のコメント :

  1. "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"
    ではなく
    [0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}
    ですね。

    正規表現においてピリオドは、
    改行文字(\n)以外の任意の一文字を表します。

    返信削除