当我尝试检查字符串是否为 IPv4 地址时,我发现该函数给出了以下结果。
144.122.1 --> 真
144.122.1.a -->假
144.122.1.333 -->假
知道为什么第一个是真的吗?
功能是:sun.net.util.IPAddressUtil.isIPv4LiteralAddress
您可以从源代码本身了解他们为什么这样做:
当指定一个三部分地址时,最后一部分被解释为一个 16 位的数量并放置在网络地址的最右边的两个字节中。这使得三部分地址格式便于将 B 类网络地址指定为 128.net.host。
所以它看起来144.122.1
等同于144.122.0.1
。
关于文本 IP 地址的部分数量的完整注释集摘录如下:
当只给出一部分时,该值直接存储在网络地址中,无需任何字节重排。
当提供两部分地址时,最后一部分被解释为 24 位数量并放置在网络地址的最右边三个字节中。这使得两部分地址格式便于将 A 类网络地址指定为 net.host。
当指定一个三部分地址时,最后一部分被解释为一个 16 位的数量并放置在网络地址的最右边的两个字节中。这使得三部分地址格式便于将 B 类网络地址指定为 128.net.host。
当指定四个部分时,每个部分都被解释为一个数据字节,并从左到右分配给 IPv4 地址的四个字节。
如果要检查 IP 地址的格式是否为 0-255.0-255.0-255.0-255,或者使用如下所示的正则表达式
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @author ragavan
*/
public class MatchIPv4Address {
public static void main(String[] args) {
String range = "(([01][0-9][0-9])|(2([0-4][0-9]|5[0-5]))|([0-9]?[0-9]))";
String pattern = range+"\\."+range+"\\."+range+"\\."+range;
System.out.println(pattern);
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher("144.229.1.99");
System.out.println(m.matches());
}
}