isIPv4LiteralAddress有误报结果?

时间:2010-11-24 14:14:37

标签: java ipv4

当我尝试检查字符串是否是IPv4地址时,我发现该函数给出了以下结果。

144.122.1 - >真

144.122.1.a - > false

144.122.1.333 - > false

知道为什么第一个是真的吗?

该功能是:sun.net.util.IPAddressUtil.isIPv4LiteralAddress

2 个答案:

答案 0 :(得分:7)

你可以从source本身看到他们为什么这样做:

  

当指定三部分地址时,最后一部分被解释为16位数量并放在网络地址的最右边两个字节中。这使得三部分地址格式便于将B类网络地址指定为128.net.host。

所以看起来144.122.1等同于144.122.0.1

以下提取了有关文本IP地址部分数量的完整评论:

  

当只给出一个部分时,该值直接存储在网络地址中,而不进行任何字节重新排列。

     

当提供两部分地址时,最后一部分被解释为24位数量并放在网络地址的最右边三个字节中。这使得两部分地址格式便于将A类网络地址指定为net.host。

     

当指定三部分地址时,最后一部分被解释为16位数量并放在网络地址的最右边两个字节中。这使得三部分地址格式便于将B类网络地址指定为128.net.host。

     

当指定了四个部分时,每个部分被解释为一个数据字节,并从左到右分配给IPv4地址的四个字节。

答案 1 :(得分: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());
    }

}