检查IPv4地址是否有效

时间:2014-10-06 21:31:51

标签: java

我正在尝试用Java编写一个基本程序来检查IP地址是否有效。我试图不使用Scanner类以外的其他外部类,也没有正则表达式。

我的代码this gist提供4个整数作为输入,每个八位字节一个。我也有this code,它比第一个更易读,但更长。

我的问题是,有没有其他方法可以在更少的行中实现这个想法,如果是这样,我将如何实现这一目标?

4 个答案:

答案 0 :(得分:1)

虽然这段代码有点冗长,但它简单,自我描述,并且已被证明是紧张的。

!

答案 1 :(得分:0)

只有一些小的改进(我认为你的代码看起来非常好 - 到目前为止我的意见)显然要阅读并且所有工作块都能正确理解....

boolean isFailed = false;
if (first < 0 || first > 255) {
    System.out.println("Octet 1 is invalid");
    isFailed = true;
}
if (second < 0 || second > 255) {
    System.out.println("Octet 2 is invalid");
    isFailed = true;
}
if (third < 0 || third > 255) {
    System.out.println("Octet 3 is invalid");
    isFailed = true;
}
if (fourth < 0 || fourth > 255) {
    System.out.println("Octet 4 is invalid");
    isFailed = true;
}

if (!isFailed){
    System.out.println("IP Address: " + first + "." + second + "." + third + "." + fourth);
}

所以我只是颠倒了打印的顺序 - 这样只会为你节省检查......

答案 2 :(得分:0)

你的方法是检查每个八位字节......

您可以简单地执行此操作4次或为其编写方法:

private static boolean check(int octet, int index){
    if (0xFF & octet < 256) return true;
    System.out.println("Octet "+index+" is invalid";
    return false;
}

并在main方法中使用此方法

if (check(first,0) && check (second, 2) && check (third, 3) && check(fourth, 4) ){
    System.out.println("your ip is valid");
}

注意 - 这只会显示第一个无效的八位字节 - 如果你想检查所有你需要的另一个布尔值

boolean result = check(first,0) && 
    check (second, 2) && 
    check (third, 3) && 
    check(fourth, 4); //reveals all errors

完全不同的方法是使用http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#getByName%28java.lang.String%29

try{
    /*InetAdress adress =*/ InetAdress.
        getByName(""+first+"."+second+"."+third+"."+forth)
    System.out.println("your ip is valid");
}catch (UnknownHostException e){
    //TODO represent that error message into a nice expression
    System.out.println("your ip is invalid");
}

但是这也没有提供关于那个无效的八位字节的信息......

(顺便说一下 - 您的代码 错误了什么?它很好,真的!)

答案 3 :(得分:0)

我感到很无聊并且写了这个正则表达式

[0] -> {0,0}
[1] -> {2,3}
[2] -> {4,5}
[3] -> {6,7}
[4] -> {0,0}

它在以下数据集上进行了测试:

public static boolean isValid(String ip) {
    boolean isvalid;

    isvalid = ip.matches(
            "(([0-9]|[0-9]{0,2}|1[0-9]*{0,2}|2[0-5][0-5]|0{0,3}).){3}" +
             "([0-9]|[0-9]{0,2}|1[0-9]*{0,2}|2[0-5][0-5]|0{0,3})"
    );

    return isvalid;
}