如何在java中解决这个问题?

时间:2012-08-09 15:51:49

标签: java

我的程序获取一个包含IP地址列表的String作为输入参数。每个IP地址由换行符分隔。它看起来像这样:

10.1.1.1
2.2.2.2
11.1.1.1

它看起来像这样

10.1.1.1-20
1.1.1.1

但它可以像这样看

172.16.12.1-20 /24
10.1.1.1

我想检查每个IP地址并返回两个列表validAddresses,invalidAddresses。

我已经编写了一个程序来处理第一种最简单的输入类型,即没有IP地址范围和没有网络掩码。

private String[] extractIPAddress(String address){
    String[] temp;
    temp = address.split("\\s+");
    return temp;
}

然后我做

addressList = extractIPAddress(String.valueOf(value));

for (int i=0; i < addressList.length; i++) {
    if (InetAddresses.isInetAddress(addressList[i]) == true) {
        validAddress = validAddress.concat(addressList[i] + '\n');
    } else {
        invalidAddress = invalidAddress.concat(addressList[i] + '\n');
    }
}

现在我正在思考如何处理最复杂的输入类型,尤其是

  • 当该行附加了一个范围1.1.1.1-10时,如何删除-10部分以检查主IP地址;如何检查范围部分-10是否会生成有效的IP地址,即1.1.1.10,然后如何将所有内容放在一起,这样我就可以将其作为validAddress字符串的一行返回,与开头时相同,即1.1.1.1-10

  • 同样的问题适用于网络掩码/24

这种程序有哪些元素?你能概括一下吗?

我以为我会做以下事情,但我不确定这是否正确以及如何实施某些部分:

  • 如果我找到-,那么从-位置开始切断部分直到行尾或“/”(怎么做?)
  • 将该部分保存到ipRange变量
  • 如果我找到/,那么从/的位置开始切断该部分直到行尾
  • 将该部分保存到netMask变量
  • 将内容复制到tmp_ipRange = ipRange
  • 移除-变量
  • 中的tem_ipRange
  • tmp_ipRange替换主IP地址的最后一个八位字节(怎么做?)
  • 将新的IP地址添加到String.split()创建的数组中(不可能,因为你不能只在java中向数组添加内容?我有什么替代方案?所以我不能在这里使用split ?)
  • 循环遍历addressList(参见上面的代码)并检查IP地址是否是有效的IP地址
  • 如果ipRange不是ipAddress,则验证后
  • ipRange添加到主null(如何查找ipAddress ipRange netMaske }属于?)
  • 验证后,如果ipAddress不是mainAddress,则将null添加到主ipAddress(和范围)(如何找到主netMask {{1}}属于?)

2 个答案:

答案 0 :(得分:4)

解析部分可以通过正则表达式完成。就像是:

final Pattern p = Pattern.compile(
    "(\\d+\\.\\d+\\.\\d+\\.\\d+)(?:-(\\d+))?(?:/(\\d+))?" );
for(String line : new String [] { "172.16.12.1-20/24",
                                  "172.16.12.1-20", 
                                  "172.16.12.1/24", 
                                  "172.16.12.1" })
{
    Matcher m = p.matcher(line);
    if (m.matches()) {
        String address = m.group(1);
        String rangePart = m.group(2); // is null if there is no range part
        String netmask = m.group(3); // is null if there is no netmask
        System.out.println(address + " - " + rangePart + " - " + netmask);
    }
}

编辑:如果您需要处理空格,可以通过添加\\s*来扩充正则表达式,例如:

"\\s*(\\d+\\.\\d+\\.\\d+\\.\\d+)(?:\\s*-\\s*(\\d+))?(?:\\s*/\\s*(\\d+))?\\s*"

这样,你就不需要打扰空格了。

您还可以为IPv6地址创建类似的正则表达式。当然会更长,但原则是一样的。

答案 1 :(得分:0)

好的,我编写了以下代码来解决这个问题。代码按预期工作。因为这是我的第一个java程序之一,我想知道你是否在这段代码中看到任何问题?:

import java.util.*;
import java.lang.System;

import com.google.common.net.InetAddresses;

public class IPCheck{

  public static String[] extractLine(String line){
    String[] temp;
    temp = line.split("\\s+");

    return temp;
  }

  public static boolean hasNetMask(String line){
    boolean result = false;
    if(line.indexOf("/") != -1)
    result = true;

    return result;
  }

  public static boolean hasIPRange(String line){
    boolean result = false;
    if(line.indexOf("-") != -1)
    result = true;

    return result;
  }

  public static String extractNetMask(String line){
    String result = "";
    result = line.substring(line.indexOf("/"));

    return result;
  }

  public static String extractIPRange(String line){
    String result = "";
    result = line.substring(line.indexOf("-"));

    return result;
  }

  public static String chop(String line, String piece){
    String result = "";
    result = line.replace(piece, "");

    return result;
  }

  public static boolean validateIPRange(String ipRange){
    int tmpInt = 0;
    ipRange = chop(ipRange, "-");
    tmpInt = Integer.valueOf(ipRange);
    if(tmpInt > 255)
      return false;
    else
      return true;
  }

  public static void main(String args[]){
    String validIPAddress = "";
    String invalidIPAddress = "";
    String str = "10.1.1.1-300\n192.180.0.1-10/16\n192.168.0.1111";
    String[] addressList;
    String netMask = "";
    String ipRange = "";

    addressList = extractLine(str);
    for(int i=0; i<addressList.length; i++){

    if(hasNetMask(addressList[i]) == true){
      netMask = extractNetMask(addressList[i]);
      addressList[i] = chop(addressList[i], netMask);
    }

    if(hasIPRange(addressList[i]) == true){
      ipRange = extractIPRange(addressList[i]);
      addressList[i] = chop(addressList[i], ipRange);

       if(validateIPRange(ipRange) == false){
        /*if the IPRange is not valid, let's attach the ipRange
        to the current IP-Address to make it invalid*/
        addressList[i] = addressList[i].concat(ipRange);
        System.out.println( addressList[i]);
       }
    }

    if(InetAddresses.isInetAddress(addressList[i]) == true){
      validIPAddress = validIPAddress.concat(addressList[i] + ipRange + netMask);
    } else {
      invalidIPAddress = invalidIPAddress.concat(addressList[i] + ipRange + netMask);
    }
  }
 }
}