给定一个字符串,其中包含一种格式的IPv6地址,是否有Java标准的方法对其进行规范化,以便对同一地址的不同格式使用相同的规范化值?
即
normalise("2001:db8:0:0:1:0:0:1") = x
normalise("2001:db8::1:0:0:1") = x
normalise("2001:db8:0:0:1::1") = x
答案 0 :(得分:3)
您可以轻松实现
通过使用InetAddress.getByName(String)
解析字符串
然后使用getHostAddress()
转换回字符串:
In [72]: df
Out[72]:
reference name lon lat
0 0 name1 34.0055 1.0041
1 1 name1 NaN NaN
2 2 name1 39.5632 3.6854
In [73]: df['city'] = df.apply(lambda x: (None, None) if np.isnan(x.lon) or np.isnan(x.lat) else getplace(x.lon, x.lat), axis=1)
In [74]: df
Out[74]:
reference name lon lat city
0 0 name1 34.0055 1.0041 (None, Algeria)
1 1 name1 NaN NaN (None, None)
2 2 name1 39.5632 3.6854 (None, Spain)
此方法将为您的所有3个示例返回public static String normalize(String s) throws UnknownHostException {
return InetAddress.getByName(s).getHostAddress();
}
。
顺便说一句:上面的代码可以规范IPv6 和 IPv4地址。
答案 1 :(得分:0)
open-source IPAddress Java library为不同的字符串格式提供了各种方法。几个可以用来产生标准化的字符串。免责声明:我是IPAddress库的项目经理。
规范字符串和规范化字符串非常适合被视为“标准化”字符串。
推荐使用规范字符串编写RFC 5952定义的IPv6地址的方式
规范化的字符串是类java.net.InetAddress生成的格式。
static void printNormalized(String strs[]) {
for (String str : strs) {
System.out.println(new IPAddressString(str).getAddress().toNormalizedString());
}
}
static void printCanonical(String strs[]) {
for (String str : strs) {
System.out.println(new IPAddressString(str).getAddress().toCanonicalString());
}
}
String strs[] = {
"2001:db8:0:0:1:0:0:1",
"2001:db8::1:0:0:1",
"2001:db8:0:0:1::1"};
printCanonical(strs);
System.out.println();
printNormalized(strs);
输出:
2001:db8::1:0:0:1
2001:db8::1:0:0:1
2001:db8::1:0:0:1
2001:db8:0:0:1:0:0:1
2001:db8:0:0:1:0:0:1
2001:db8:0:0:1:0:0:1