- PR -

IPアドレスの文字列解析

1
投稿者投稿内容
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-05-30 13:25
IPアドレスの文字列解析をしたいのですが、
java.net.InetAddress.getByName(host)のメソッドを
使うと、IPアドレスの書式にあっていないものはhost名と
解釈して、DNS名の解決をしようとしてしまいます。
#そっちがメインの用途か?

この場合、ホスト名が解決できなければ、数秒待たされることになり、
解決できたとしても、得られるInetAddressクラスは目的の物ではありませんん。

純粋にIPアドレスの文字列解析だけを行うには
自作する必要があるのでしょうか?
#IPv6アドレスの解析がめんどくさそうで渋ってるだけですが


raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2003-05-30 16:53
たんなる、XXX.XXX.XXX.XXX のフォーマットであるかどうかの
チェックをするのであれば、正規表現がそのまま使えますし、
JDK1.4では String#split . 単位に文字列を分割することもできます。
それ未満のバージョンでは
StringTokenizer クラスを使用し、ループ内でチェックすればよいと思います。

的外れかな?tt
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-05-30 18:22
レスありがとうございます。

> たんなる、XXX.XXX.XXX.XXX のフォーマット
これだけなら簡単なんですけどね。

IPv6だと、
1080:0:0:0:8:800:200C:417A
とか、
1080::8:800:200C:417A
とか、
::FFFF:129.144.52.38
::129.144.52.38
とかちょっとだけ複雑で、

自作してもいいけど、IPv6についてよく知らないし、
RFCとか読まないとちゃんと仕様に従っているかよくわかんないなー。
って感じです。
少なくとも、正規表現での書き方はよくわかんないです。

InetAddressのgetByNameのソースを見てみたところ、
まず、Inet4AddressのtextToNumericFormatメソッド(パッケージプライベート)
を呼びバイト配列を取得し、nullが返ってきたら
Inet6AddressのtextToNumericFormatメソッド(同じくパッケージプライベート)
を呼ぶという処理をしています。

このtextToNumericFormatメソッドを呼べたらいいのですが、
いかんせんpublicじゃ無いので...

まあ、仕方が無いのでソースを参考に自作します。

#ナイスなアイディアをお持ちの方を引き続き募集します。

[ メッセージ編集済み 編集者: Wata 編集日時 2003-05-30 19:16 ]
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-06-02 10:17
ども、ほむらです。
IPv6は書式がわからないので正規表現を作れませんが
普通のものであれば
(
((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]{1,2}))\.){3}
((25[0-5])|(2[0-4][0-9])|[0-1]?[0-9]{1,2}))
)|(([0-9a-fA-F]{1,2}\.){3}[0-9a-fA-F]{1,2})
こんな感じでしょうか?(Perlならの話)
実際には改行を削除する必要がありますけど。。。
{min,max}は繰り返し回数の指定なのでJAVAの正規表現に無い場合には
その数だけコピーすることになるかと。。。
.は一文字のワイルドカードになってしまうので\でエスケープしています。
[]は正規表現なら使えるはずなのでもんだいないかな〜

作ってみて思ったんですが結構複雑ですよね。。。
入力がどこからくるのかわからないのでなんですが。。
ある程度許可する入力フォーマットを絞ったほうがいいかも。。。
IPv4なら16進数のみとか。。

JAVAではありませんが正規表現については以下のURLを参考にしてみてください。
http://www.sixnine.net/regexp/index.html

# 正規表現に関するサイトのアドレスを追加

[ メッセージ編集済み 編集者: ほむら 編集日時 2003-06-02 11:23 ]
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-06-10 12:45
どうも、Wataです。
>ほむらさん
すみません。ずっとレスに気付いていませんでした...(汗 m(_ _)m

で、いちおう正規表現については人並み?に存じておりますし、他の機能にも使ってます。
javadocを見ながら勉強しましたから...。
ただ、それでIPv6を書き表すのはムずいなーという事です。
ちなみにjavaでも{min,max}の表現は使えますよ。

#ただし、開発はj2sdk1.3なのでjakarta-OROだったりして...。

肝心のIPアドレス解析の件ですが、IPv6の"::"で0のビットを省略する
記述方法が正規表現と相性が悪く、また、バイト配列の取り出しもしたいので、
ふつーにindexOfとsubstringとparseIntで作りました。

あと、IPv6のテキスト表現はjavadocのInet6Addressに大体のことは書いてますよ。

また、上の自分のレスはj2sdk1.4での挙動&ソースです。1.3はまた結構違うみたい。
#1.3でつくんだから1.3で調べろよ > 自分
1

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