文字列がIPv4アドレスであるかどうかを確認しようとすると、関数が次の結果を返すことがわかりました。
144.122.1 --> 真
144.122.1.a --> 偽
144.122.1.333 -->偽
最初のものが真実である理由は何ですか?
機能は次のとおりです。sun.net.util.IPAddressUtil.isIPv4LiteralAddress
ソース自体から、彼らがこのようにした理由がわかります。
3 つの部分からなるアドレスが指定されている場合、最後の部分は 16 ビットの量として解釈され、ネットワーク アドレスの右端の 2 バイトに配置されます。これにより、クラス B ネットワーク アドレスを 128.net.host として指定する場合に、3 部構成のアドレス形式が便利になります。
144.122.1
したがって、 に等しいように見えます144.122.0.1
。
テキストの IP アドレスの部分の数に関するコメントの完全なセットを以下に抽出します。
1 つの部分のみが指定されている場合、値はバイトの再配置なしでネットワーク アドレスに直接格納されます。
2 つの部分からなるアドレスが提供されると、最後の部分は 24 ビットの量として解釈され、ネットワーク アドレスの右端の 3 バイトに配置されます。これにより、クラス A のネットワーク アドレスを net.host として指定する場合に、2 つの部分からなるアドレス形式が便利になります。
3 つの部分からなるアドレスが指定されている場合、最後の部分は 16 ビットの量として解釈され、ネットワーク アドレスの右端の 2 バイトに配置されます。これにより、クラス B ネットワーク アドレスを 128.net.host として指定する場合に、3 部構成のアドレス形式が便利になります。
4 つの部分が指定されている場合、それぞれが 1 バイトのデータとして解釈され、IPv4 アドレスの 4 バイトに左から右に割り当てられます。
または、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());
}
}