我的程序获取一个包含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地址的最后一个八位字节(怎么做?)String.split()
创建的数组中(不可能,因为你不能只在java中向数组添加内容?我有什么替代方案?所以我不能在这里使用split ?)addressList
(参见上面的代码)并检查IP地址是否是有效的IP地址ipRange
不是ipAddress
,则验证后ipRange
添加到主null
(如何查找ipAddress
ipRange
netMaske
}属于?)ipAddress
不是mainAddress
,则将null
添加到主ipAddress
(和范围)(如何找到主netMask
{{1}}属于?)答案 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);
}
}
}
}