需求描述
Write a Java program to check a string is a valid IP address.
解决方案
在Java中,我们可以使用正则表达式或者内置的Java类库来验证字符串是否是一个合法的IP地址。以下是两种不同的实现方法。
方法一:使用正则表达式
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String ip = "192.168.0.1";
boolean isValid = isValidIP(ip);
System.out.println(isValid ? "IP地址有效" : "IP地址无效");
}
private static boolean isValidIP(String ip) {
// 定义一个IPv4地址的正则表达式
String regex = "^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$";
Pattern pattern = Pattern.compile(regex);
return pattern.matcher(ip).matches();
}
}
在此代码中,我们首先定义了一个IP地址的正则表达式,然后使用Pattern.compile
和matcher
方法检查给定的IP地址是否符合此正则表达式。
时间复杂度:O(n),n为待检测的字符串的长度。正则表达式会进行完整的字符串遍历。
空间复杂度:O(1),不需要额外的存储空间,只需要一个标记位来存储正则匹配结果。
详细解释正则表达式:
^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$
这个正则表达式是用来验证IPv4地址的,下面是对这个正则表达式的详细解释:
-
^
:这个符号表示字符串的开始。这意味着我们要从字符串的开始部分进行匹配。 -
((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.)
:这个部分在对四部分的IP地址进行匹配,每部分都在0到255之间。-
25[0-5]
:这部分用于匹配250-255之间的数字。 -
2[0-4]\\d
:这部分用于匹配200-249之间的数字。 -
[01]?\\d\\d?
:这部分用于匹配0-199之间的数字。[01]?
表示第一位数字可以是0或1,也可以没有。\\d\\d?
表示第二位和第三位可以是任何数字,第三位数字也可以没有。 -
\\.
:这部分匹配IP地址中的点(.)。
这个部分后面的
{3}
表示这个部分需要重复三次,也就是说,前三部分的IP地址都需要符合这个规则。 -
-
(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)
:这个部分用于匹配IP地址的最后一部分,规则与前面的部分一样。 -
$
:这个符号表示字符串的结束。这意味着我们要在字符串的结束部分进行匹配。
综合以上,这个正则表达式的含义就是:字符串的开始到结束都要符合IPv4地址的规则,IP地址是由四部分组成,每部分都在0-255之间,并且四部分之间用点(.)分隔。
方法二:使用InetAddress类
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Main {
public static void main(String[] args) {
String ip = "192.168.0.1";
boolean isValid = isValidIP(ip);
System.out.println(isValid ? "IP地址有效" : "IP地址无效");
}
private static boolean isValidIP(String ip) {
try {
// 如果IP地址无效,InetAddress.getByName会抛出UnknownHostException
InetAddress.getByName(ip);
return true;
} catch (UnknownHostException e) {
return false;
}
}
}
在这个方法中,我们使用了InetAddress.getByName
方法来检查IP地址的合法性。如果IP地址无效,此方法会抛出一个UnknownHostException
异常,我们通过捕获此异常来判断IP地址的合法性。
时间复杂度:O(n),n为待检测的字符串的长度。需要遍历并分割整个字符串,并且对分割后的每个部分进行检查。
空间复杂度:O(m),m为分割后得到的字符串数组的长度(即IP地址的段数,一般为4)。这是因为需要用到额外的存储空间来存储分割后的字符串数组。
这两种方法都可以有效地检查字符串是否是一个合法的IP地址,你可以根据自己的需要选择使用。