2010-11-24 13 views
3

文字列がIPv4アドレスかどうかを確認しようとすると、この関数が次のような結果をもたらすことがわかりました。isIPv4LiteralAddressには偽陽性の結果がありますか?

144.122.1 - >真

144.122.1.a - >偽

144.122.1.333 - >偽

最初のいずれかに該当する理由を任意のアイデア?

機能は次のとおりです。彼らはsource自体から、このようにそれをしなかった理由をsun.net.util.IPAddressUtil.isIPv4LiteralAddress

+0

実際のフォーマットであるかどうかを確認したい場合は、以下のように正規表現を使用します。 .Netは、144.122.0.1と144.1を144.0.0.1として解析します。理由を知ることは良いことです。 Btw、あなたはこれをやっている機能について言及していない。 – spender

+0

関数名はisIPv4LiteralAddressのキャプションにあります。実際のパッケージはsun.net.util.IPAddressUtilです。ありがとう、私は質問に追加しました。 – Huseyin

答えて

7

あなたは見ることができます:

3つの部分アドレスが指定されると、最後の部分は以下のように解釈されます16-ネットワークアドレスの右端の2バイトに配置されます。これにより、クラスBのネットワークアドレスを128.net.hostとして指定するのに便利な3つの部分アドレスフォーマットが作成されます。

144.122.0.1に相当します。

テキストのIPアドレスは以下抽出するの部品の数に関するコメントのフルセット:一部のみが与えられた場合

、値は任意のバイト再配置することなく、ネットワークアドレスに直接格納されています。

2つの部分のアドレスが指定された場合、最後の部分は24ビットの数量として解釈され、ネットワークアドレスの最も右側の3バイトに配置されます。これにより、クラスAのネットワークアドレスをnet.hostとして指定するのに便利な2つの部分アドレス形式が作成されます。

3つの部分のアドレスが指定されている場合、最後の部分は16ビットの数量として解釈され、ネットワークアドレスの右端2バイトに配置されます。これにより、クラスBのネットワークアドレスを128.net.hostとして指定するのに便利な3つの部分アドレスフォーマットが作成されます。

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

2

それとも、IPアドレスが0-255.0-255.0-255.0-255

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

/** 
* 
* @author ragavan 
*/ 
public class MatchIPv4Address { 
    public static void main(String[] args) { 
     String range = "(([01][0-9][0-9])|(2([0-4][0-9]|5[0-5]))|([0-9]?[0-9]))"; 
     String pattern = range+"\\."+range+"\\."+range+"\\."+range; 
     System.out.println(pattern); 
     Pattern p = Pattern.compile(pattern); 
     Matcher m = p.matcher("144.229.1.99"); 
     System.out.println(m.matches()); 
    } 

} 
+0

'range' _still_はそれほど正しいとは言えませんが(オリジナルでは改善されていますが)、例えば249を許可していないようです。 '([0-9] {1,2})|(1 [0-9] {2})|(2 [0-4] [0-9])|(25 [0- 5]) '?私自身は '[1-9] [0-9] {0,2}'を使い、別々に上の範囲を調べています(ただし、正規表現は有用だが_everything_のためには必要でないという考え方に従う)。 – paxdiablo

+0

私はそれを編集しました。私はそれを気づかなかったようだ。ごめんなさい。 – Ragavan

関連する問題