- - PR -
IPアドレスの文字列解析
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2003-05-30 13:25
IPアドレスの文字列解析をしたいのですが、
java.net.InetAddress.getByName(host)のメソッドを 使うと、IPアドレスの書式にあっていないものはhost名と 解釈して、DNS名の解決をしようとしてしまいます。 #そっちがメインの用途か? この場合、ホスト名が解決できなければ、数秒待たされることになり、 解決できたとしても、得られるInetAddressクラスは目的の物ではありませんん。 純粋にIPアドレスの文字列解析だけを行うには 自作する必要があるのでしょうか? #IPv6アドレスの解析がめんどくさそうで渋ってるだけですが |
|
投稿日時: 2003-05-30 16:53
たんなる、XXX.XXX.XXX.XXX のフォーマットであるかどうかの
チェックをするのであれば、正規表現がそのまま使えますし、 JDK1.4では String#split . 単位に文字列を分割することもできます。 それ未満のバージョンでは StringTokenizer クラスを使用し、ループ内でチェックすればよいと思います。 的外れかな?tt |
|
投稿日時: 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-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 ] |
|
投稿日時: 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