- PR -

boolean isIpAddress(String str) を実装するには?

投票結果総投票数:40
1の方法 7 17.50%
2の方法 4 10.00%
3の方法 3 7.50%
4の方法 4 10.00%
5の方法 2 5.00%
6の方法 0 0.00%
7の方法 20 50.00%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
でくのぼう
大ベテラン
会議室デビュー日: 2003/10/06
投稿数: 162
投稿日時: 2003-12-09 17:15
パッと思いつくのはどれでしょう?
お遊びにつき、あまり深く考えずにどうぞ。

1: 正規表現 java.lang.String#matches()
2: 正規表現 java.util.regex.Matcher & Pattern
3: 正規表現 Jakarta ORO
4: java.util.StringTokenizer で頑張る
5: java.lang.String#toCharArray() で更に頑張る
6: 実際に接続して繋がらなかったら false を返す
7: 後輩のデスクに「これ、作っといて」とメモを置く
t-wata
大ベテラン
会議室デビュー日: 2002/07/12
投稿数: 209
お住まい・勤務地: 東京
投稿日時: 2003-12-09 18:18
try {
InetAddress.getByName(str);
return true;
} catch (Exception e){
return false;
}
って感じにしちゃうかな。
IPv6とか考えると、正規表現じゃ面倒。
IPv4だけでいいとしても、Inet4Addressのjavadocを見ると、
引用:

d.d.d.d
d.d.d
d.d
d
4 つの部分が指定されると、各部分がデータのバイトとして解釈され、左から右へ、IPv4 アドレスの 4 つのバイトに割り当てられます。

3 部形式のアドレスが指定されると、最後の部分は 16 ビットデータとして解釈されて、ネットワークアドレスの右側の 2 バイトに配置されます。このため、3 部形式のアドレスは Class B のネットワークアドレスを 128.net.host として指定するのに便利な形式です。

2 部形式のアドレスが指定されると、最後の部分は 24 ビットデータとして解釈されて、ネットワークアドレスの右側の 3 バイトに配置されます。このため、2 部形式のアドレスは Class A のネットワークアドレスを net.host として指定するのに便利な形式です。

1 つの部分だけが指定されると、その値は直接ネットワークアドレスに格納され、バイトの再配置は行われません。



と4種類あるし、こんだけのバリデーションチェックは(バイト長までチェックするとしたら)面倒だし馬鹿馬鹿しい。
でくのぼう
大ベテラン
会議室デビュー日: 2003/10/06
投稿数: 162
投稿日時: 2003-12-09 19:07
こんにちは t-wata さん。

う、InetAddress.getByName() は接続不能な場合にも
例外を吐くと勘違いしてましたよ。

こりゃ選択肢に付け忘れたな。
即ち「8: @IT会議室でもっといい方法を教えてもらう」
raccoon
ベテラン
会議室デビュー日: 2002/12/18
投稿数: 58
投稿日時: 2003-12-09 19:08
わたしもt-wataさんのやり方に1票です。
ただ,InetAddress.getByName()は,IPアドレスだけでなく
ホスト名(hostsに書いてあったりDNSから引けるやつ)でも
OKにしてくれちゃいますよね。

ホスト名はNGにしたいのだとすると・・・7かなぁ。
でくのぼう
大ベテラン
会議室デビュー日: 2003/10/06
投稿数: 162
投稿日時: 2003-12-09 19:14
おっと、ニアミスだ。
raccoon さん、こんにちは。

引用:

ただ,InetAddress.getByName()は,IPアドレスだけでなく
ホスト名(hostsに書いてあったりDNSから引けるやつ)でも
OKにしてくれちゃいますよね。



これは確かに。
実際は各選択肢のどれかと複合させる事になるでしょうね。

引用:

ホスト名はNGにしたいのだとすると・・・7かなぁ。



ううむ、現在までの結果を見ると、
後輩のデスクとメモはプログラマには必須のようです。
肝心の後輩が居なくならない事を祈ります。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-12-09 19:22
どうも、Wataです。
以前、同じ問題に直面しました。

関連スレッド→IPアドレスの文字列解析

残念ながら、7の方法が選択できなかったので(後輩がいない!)、
泣く泣く5で自作しました。

というか、Inet6AddressとInet4AddressのtextToNumericFormat(String src)を
コピーしてリファクタリングって感じでした。

# 追加
今、もう一回やるなら、jakarta-OROで
Perl5Util#split(list, "([:.])");
とInteger#parseInt()でやるかも

[ メッセージ編集済み 編集者: Wata 編集日時 2003-12-09 19:42 ]
t-wata
大ベテラン
会議室デビュー日: 2002/07/12
投稿数: 209
お住まい・勤務地: 東京
投稿日時: 2003-12-09 20:57
引用:

ホスト名はNGにしたいのだとすると・・・7かなぁ


単に、^[0-9.]*$か^[:.0-9A-F]*$にマッチしなかったらホスト名と見なしてアウトにするだけでもいいような。
私なら、後輩にはもっと難しい事を頼みます

[ メッセージ編集済み 編集者: t-wata 編集日時 2003-12-09 22:43 ]
raccoon
ベテラン
会議室デビュー日: 2002/12/18
投稿数: 58
投稿日時: 2003-12-09 23:07
> 単に、^[0-9.]*$か^[:.0-9A-F]*$にマッチしなかったらホスト名と見なしてアウトにするだけでもいいような。

なるほど。
でくのぼうさんも仰っているように,「複合」させればいいんですね。

InetAddress.getByName()を使った場合,DNSまで探しにいっちゃうと
パフォーマンスがちょっと気になってたんですが,この方法で先に
ホスト名をはじいておけば大丈夫そうですね。

数字とピリオドだけでもホスト名にできたような気もしますが
(極端な話「.123.」とか),面倒な解析処理を作るのと,
そんなホスト名が実在する可能性とのトレードオフを考えれば,
実用にはこれで十分という判断はアリでしょう。


> 私なら、後輩にはもっと難しい事を頼みます

最初は「後輩の力の差か?」と思いましたが,よくよく考えてみると
そうやって難しいことやらせていかないと育たないですね。
# ってことは,教えてる先輩の力の差か・・・

スキルアップ/キャリアアップ(JOB@IT)