在 Java 中验证 IPv4地址

我想用 Java 验证一个 IPv4地址。它应该写使用 点分十进制,所以它应该有3个点(“ .”) ,没有字符,数字之间的点,和数字应该在一个有效的范围。应该怎么做?

147672 次浏览

编写一个合适的正则表达式并对其进行验证。

您可以使用正则表达式,如下所示:

(([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 支持正则表达式,参见 Regex. 模式

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()调用,以便它只执行一次。

使用正则表达式非常简单(但请注意,这比使用 Apache Commons 实用程序的 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

如果是 IP4,可以使用如下正则表达式:

^(2[0-5][0-5])|(1\\d\\d)|([1-9]?\\d)\\.){3}(2[0-5][0-5])|(1\\d\\d)|([1-9]?\\d)$.

请看一下 Sun.net Util中的 IPAddressUtil OOTB 类,这会对你有所帮助。

还有一个未记录的实用工具类 sun.net.util.IPAddressUtil,它是 你实际上不应该使用,尽管它可能在一个快速的一次性的、一次性的实用工具中很有用:

boolean isIP = IPAddressUtil.isIPv4LiteralAddress(ipAddressString);

在内部,这是 InetAddress用来解析 IP 地址的实用工具类。

请注意,对于像“123”这样的字符串,这将返回 true,从技术上讲,它是 有效的 IPv4地址,只不过不是点分十进制。

使用 番石榴

InetAddresses.isInetAddress(ipStr)

请参阅使用 apache commons 库 InetAddressValidatorhttps://stackoverflow.com/a/5668971/1586965

或者你可以使用这个函数-

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);
}

这是针对 Android 的,测试 IPv4IPv6

注意: 常用的 InetAddressUtils不被推荐使用。请使用新的 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 exception) {
return false;
}
}

如果您不关心这个范围,下面的表达式将有助于验证从1.1.1.1到999.999.999的范围

"[1-9]{1,3}\\.[1-9]{1,3}\\.[1-9]{1,3}\\.[1-9]{1,3}"

有很多方法可以实现这一点,但正则表达式更有效。

看看下面的代码:

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));
}

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
}
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 地址类以及它是否是保留 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));


}

Public void setIpAddress (StringipAddress){ 如果(ipAdresss.match (“ ^ (? : (? : 25[0-5] | 2[0-4][0-9] | [0-9][0-9] ?)。){3}(? : 25[0-5] | 2[0-4][0-9] | [01] ? [0-9][0-9] ?) $))//ipv4的正则表达式 地址 = ipAddress; 别的 Println (“错误的 IpAddress”) ; }

使用正则表达式 获得两行内的有效 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;
}

Apache-httpComponent 的库

// ipv4 is true
assertTrue(InetAddressUtils.isIPv4Address("127.0.0.1"));
// not detect the ipv6
assertFalse(InetAddressUtils.isIPv4Address("2001:0db8:85a3:0000:0000:8a2e:0370:7334"));

Maven lib (2019年9月更新)

<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.10</version>
</dependency>

我的解决方案(支持领先的0) :

   String pattern="^[0-9](\\d{1,2}|1?[0-9][0-9]|2?[0-4][0-9]|25?[0-5])?\\.(\\d{1,2}|1?[0-9][0-9]|2?[0-4][0-9]|25[0-5])?\\.(\\d{1,2}|1?[0-9][0-9]|2?[0-4][0-9]|25[0-5])?\\.(\\d{1,2}|1?[0-9][0-9]|2?[0-4][0-9]|25[0-5])?$";
 private static final String IPV4_PATTERN_ALLOW_LEADING_ZERO =
"^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
"([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
private static boolean findValidIP(String ipAddress) {
String[] ipAddressSplited = ipAddress.split("\\.");
int correctFragments = 0;


for (String ctr : ipAddressSplited) {
int value = -10;
try {
value = Integer.parseInt(ctr);
} catch (NumberFormatException exception) {
value = -1;
}


if (value >= 0 && value <= 255 && ipAddressSplited.length == 4) correctFragments++;
}


System.out.println(correctFragments == 4 ? "Valid IP Address - " + ipAddress : "Invalid IP Address - " + ipAddress);
return correctFragments == 4;
}

我写一个正则表达式到 验证 IPv4
你可以参考我的解决方案。

import java.util.Scanner;


/**
* @author ManhKM on 11/26/2021
* @project java-core-v1.0
*/
public class ValidateIPv4 {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
String IP = in.next();
System.out.println(IP.matches(new MyRegex().pattern));
}


}
}


class MyRegex{


String pattern = "^((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]?)$";
}