当我尝试检查字符串是否是IPv4地址时,我发现该函数给出了以下结果。
144.122.1 - >真
144.122.1.a - > false
144.122.1.333 - > false
知道为什么第一个是真的吗?
该功能是:sun.net.util.IPAddressUtil.isIPv4LiteralAddress
答案 0 :(得分:7)
你可以从source本身看到他们为什么这样做:
当指定三部分地址时,最后一部分被解释为16位数量并放在网络地址的最右边两个字节中。这使得三部分地址格式便于将B类网络地址指定为128.net.host。
所以看起来144.122.1
等同于144.122.0.1
。
以下提取了有关文本IP地址部分数量的完整评论:
当只给出一个部分时,该值直接存储在网络地址中,而不进行任何字节重新排列。
当提供两部分地址时,最后一部分被解释为24位数量并放在网络地址的最右边三个字节中。这使得两部分地址格式便于将A类网络地址指定为net.host。
当指定三部分地址时,最后一部分被解释为16位数量并放在网络地址的最右边两个字节中。这使得三部分地址格式便于将B类网络地址指定为128.net.host。
当指定了四个部分时,每个部分被解释为一个数据字节,并从左到右分配给IPv4地址的四个字节。
答案 1 :(得分:2)
如果要检查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());
}
}