如何解决验证Java中的IPv4地址
| 我想使用Java验证IPv4地址。应该使用点十进制表示法来编写它,因此它应该有3个点(\“.
\”),没有字符,点之间的数字以及数字应在有效范围内。应该怎么做?
解决方法
您可以使用此功能-
public static boolean validate(final String ip) {
String PATTERN = \"^((0|1\\\\d?\\\\d?|2[0-4]?\\\\d?|25[0-5]?|[3-9]\\\\d?)\\\\.){3}(0|1\\\\d?\\\\d?|2[0-4]?\\\\d?|25[0-5]?|[3-9]\\\\d?)$\";
return ip.matches(PATTERN);
}
,使用正则表达式非常简单(但请注意,与使用Apache Commons Utility的worpet答案相比,这样做效率低下,而且难以阅读)
private static final Pattern PATTERN = Pattern.compile(
\"^(([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.){3}([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])$\");
public static boolean validate(final String ip) {
return PATTERN.matcher(ip).matches();
}
基于帖子Mkyong
,尝试使用InetAddressValidator实用程序类。
此处的文档:
http://commons.apache.org/validator/apidocs/org/apache/commons/validator/routines/InetAddressValidator.html
在这里下载:
http://commons.apache.org/validator/
,使用番石榴的
InetAddresses.isInetAddress(ipStr)
,您可以使用正则表达式,如下所示:
(([0-1]?[0-9]{1,2}\\.)|(2[0-4][0-9]\\.)|(25[0-5]\\.)){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))
这将验证值在范围内。
Android支持正则表达式。参见java.util.regex.Pattern。
class ValidateIPV4
{
static private final String IPV4_REGEX = \"(([0-1]?[0-9]{1,2}\\\\.)|(2[0-4][0-9]\\\\.)|(25[0-5]\\\\.)){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))\";
static private Pattern IPV4_PATTERN = Pattern.compile(IPV4_REGEX);
public static boolean isValidIPV4(final String s)
{
return IPV4_PATTERN.matcher(s).matches();
}
}
为了避免反复编译模式,最好放置Pattern.compile()
调用,使其仅执行一次。
,还有一个未记录的实用程序类sun.net.util.IPAddressUtil
,尽管它在快速的一次性使用的实用程序中可能很有用,但您不应实际使用它:
boolean isIP = IPAddressUtil.isIPv4LiteralAddress(ipAddressString);
在内部,这是ѭ9'实用程序类,用于解析IP地址。
请注意,对于像\“ 123 \”这样的字符串,这将返回true,从技术上讲,它们是有效的IPv4地址,只是不使用点十进制表示法。
,这是针对Android的,测试IPv4和IPv6
注意:不赞成使用常用的“ 10”。使用新的InetAddress
班级
public static Boolean isIPv4Address(String address) {
if (address.isEmpty()) {
return false;
}
try {
Object res = InetAddress.getByName(address);
return res instanceof Inet4Address || res instanceof Inet6Address
} catch (final UnknownHostException ex) {
return false;
}
}
,IPAddress Java库将执行此操作。链接中提供了javadoc。免责声明:我是项目经理。
该库透明地支持IPv4和IPv6,因此验证在下面的工作原理相同,并且还支持CIDR子网。
验证地址是否有效
String str = \"1.2.3.4\";
IPAddressString addrString = new IPAddressString(str);
try {
IPAddress addr = addrString.toAddress();
...
} catch(AddressStringException e) {
//e.getMessage provides validation issue
}
,如果是IP4,则可以使用如下正则表达式:
^(2[0-5][0-5])|(1\\\\d\\\\d)|([1-9]?\\\\d)\\\\.){3}(2[0-5][0-5])|(1\\\\d\\\\d)|([1-9]?\\\\d)$
。
,编写一个合适的正则表达式,然后对此进行验证。 JVM完全支持正则表达式。
,有很多方法可以实现这一点,但是正则表达式更有效。
看下面的代码:
public static void main(String[] args) {
String ipStr1 = \"255.245.188.123\"; // valid IP address
String ipStr2 = \"255.245.188.273\"; // invalid IP address - 273 is greater than 255
validateIP(ipStr1);
validateIP(ipStr2);
}
public static void validateIP(String ipStr) {
String regex = \"\\\\b((25[0–5]|2[0–4]\\\\d|[01]?\\\\d\\\\d?)(\\\\.)){3}(25[0–5]|2[0–4]\\\\d|[01]?\\\\d\\\\d?)\\\\b\";
System.out.println(ipStr + \" is valid? \" + Pattern.matches(regex,ipStr));
}
,正则表达式是解决此问题的最有效方法。
看下面的代码。沿着有效性,它还会检查其所属的IP地址类别,以及是否保留IP地址
Pattern ipPattern;
int[] arr=new int[4];
int i=0;
//Method to check validity
private String validateIpAddress(String ipAddress) {
Matcher ipMatcher=ipPattern.matcher(ipAddress);
//Condition to check input IP format
if(ipMatcher.matches()) {
//Split input IP Address on basis of .
String[] octate=ipAddress.split(\"[.]\");
for(String x:octate) {
//Convert String number into integer
arr[i]=Integer.parseInt(x);
i++;
}
//Check whether input is Class A IP Address or not
if(arr[0]<=127) {
if(arr[0]==0||arr[0]==127)
return(\" is Reserved IP Address of Class A\");
else if(arr[1]==0&&arr[2]==0&&arr[3]==0)
return(\" is Class A Network address\");
else if(arr[1]==255&&arr[2]==255&&arr[3]==255)
return( \" is Class A Broadcast address\");
else
return(\" is valid IP Address of Class A\");
}
//Check whether input is Class B IP Address or not
else if(arr[0]>=128&&arr[0]<=191) {
if(arr[2]==0&&arr[3]==0)
return(\" is Class B Network address\");
else if(arr[2]==255&&arr[3]==255)
return(\" is Class B Broadcast address\");
else
return(\" is valid IP Address of Class B\");
}
//Check whether input is Class C IP Address or not
else if(arr[0]>=192&&arr[0]<=223) {
if(arr[3]==0)
return(\" is Class C Network address\");
else if(arr[3]==255)
return(\" is Class C Broadcast address\");
else
return( \" is valid IP Address of Class C\");
}
//Check whether input is Class D IP Address or not
else if(arr[0]>=224&&arr[0]<=239) {
return(\" is Class D IP Address Reserved for multicasting\");
}
//Execute if input is Class E IP Address
else {
return(\" is Class E IP Address Reserved for Research and Development by DOD\");
}
}
//Input not matched with IP Address pattern
else
return(\" is Invalid IP Address\");
}
public static void main(String[] args) {
Scanner scan= new Scanner(System.in);
System.out.println(\"Enter IP Address: \");
//Input IP Address from user
String ipAddress=scan.nextLine();
scan.close();
IPAddress obj=new IPAddress();
//Regex for IP Address
obj.ipPattern=Pattern.compile(\"((([0-1]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.){3}([0-1]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5]))\");
//Display output
System.out.println(ipAddress+ obj.validateIpAddress(ipAddress));
}
,请查看sun.net.util中提供的IPAddressUtil OOTB类,这对您有帮助。
,如果您不关心范围,则以下表达式将有助于验证从1.1.1.1到999.999.999.999的范围
\"[1-9]{1,3}\\\\.[1-9]{1,3}\"
,public static boolean isIpv4(String ipAddress) {
if (ipAddress == null) {
return false;
}
String ip = \"^(1\\\\d{2}|2[0-4]\\\\d|25[0-5]|[1-9]\\\\d|[1-9])\\\\.\"
+ \"(1\\\\d{2}|2[0-4]\\\\d|25[0-5]|[1-9]\\\\d|\\\\d)\\\\.\"
+ \"(1\\\\d{2}|2[0-4]\\\\d|25[0-5]|[1-9]\\\\d|\\\\d)\\\\.\"
+ \"(1\\\\d{2}|2[0-4]\\\\d|25[0-5]|[1-9]\\\\d|\\\\d)$\";
Pattern pattern = Pattern.compile(ip);
Matcher matcher = pattern.matcher(ipAddress);
return matcher.matches();
}
,使用正则表达式在两行中获取有效的IP地址请检查代码的注释会话正则表达式如何工作以获取数字范围。
public class regexTest {
public static void main(String[] args) {
String IP = \"255.001.001.255\";
System.out.println(IP.matches(new MyRegex().pattern));
}
}
/*
* /d - stands for any number between 0 to 9
* /d{1,2} - preceding number that 0 to 9 here,can be of 1 digit to 2 digit . so minimum 0 and maximum 99
* | this stands for or operator
*
* () this is applied on a group to get the single value of outcome
* (0|1)\\d{2} = first digit is either 0 or 1 and other two digits can be any number between ( 0 to 9)
* 2[0-4]\\d - first digit is 2,second digit can be between 0 to 4 and last digit can be 0 to 9
* 25[0-5] - first two digit will be 25 and last digit will be between 0 to 5
*
* */
class MyRegex {
String zeroTo255 = \"(\\\\d{1,2}|(0|1)\\\\d{2}|2[0-4]\\\\d|25[0-5])\";
public String pattern = zeroTo255 + \"\\\\.\" + zeroTo255 + \"\\\\.\" + zeroTo255 + \"\\\\.\" + zeroTo255;;
}
,/**
* Check if ip is valid
*
* @param ip to be checked
* @return <tt>true</tt> if <tt>ip</tt> is valid,otherwise <tt>false</tt>
*/
private static boolean isValid(String ip) {
String[] bits = ip.split(\"\\\\.\");
if (bits.length != 4) {
return false;
}
for (String bit : bits) {
try {
if (Integer.valueOf(bit) < 0 || Integer.valueOf(bit) > 255) {
return false;
}
} catch (NumberFormatException e) {
return false; /* contains other other character */
}
}
return true;
}
,public void setIpAddress(String ipAddress) {
if(ipAddress.matches(\"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$\")) //regular expression for ipv4
this.ipAddress = ipAddress;
else
System.out.println(\"incorrect IpAddress\");
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。