3

我的程序将一个包含 IP 地址列表的字符串作为输入参数。每个 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
  • 将主 IP 地址的最后一个八位字节替换为tmp_ipRange(怎么做?)
  • 将新的 IP 地址添加到由创建的数组中String.split()(不可能,因为你不能只在 java 中的数组中添加一些东西?我有什么替代方法?所以我不能在这里使用拆分?)
  • 循环addressList(见上面的代码)并检查IP地址是否是有效的IP地址
  • 验证后添加ipRange到主ipAddress如果ipRange不是null(我如何找到所属的主ipAddressipRange
  • 验证后添加netMaske到主ipAddress(和范围)如果mainAddress不是null(我如何找到主ipAddress所属netMask的?)
4

2 回答 2

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 地址创建类似的正则表达式。当然会更长,但原理是一样的。

于 2012-08-09T16:15:44.617 回答
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);
    }
  }
 }
}
于 2012-08-12T20:15:35.883 回答