如何解析包含字符字符的IP地址或主机名?

时间:2015-08-31 15:11:19

标签: java regex string

我正在尝试将两种不同类型的字符串,IP地址和DNS地址分开。我无法弄清楚如何拆分它。我最初的想法是:

String stringIP = "123.345.12.1234";
String stringDNS = "iam.adns234.address.com";

if(!Pattern.matches("^[a-zA-Z0-9.]*$",stringDNS)){
    //I only want to get IP type strings here, so I am trying to separate out anything containing alpha characters. `stringDNS` should not be allowed into the if statement.
}

4 个答案:

答案 0 :(得分:3)

您可以"验证"您的IP具有以下模式:

String stringIP = "123.345.12.1234";
String stringDNS = "iam.adns234.address.com";
//                | start of input
//                | | 1-4 digits
//                | |      | dot
//                | |      |    | 3 occurrences
//                | |      |    | | 1-4 digits
//                | |      |    | |       | end of input
String pattern = "^(\\d{1,4}\\.){3}\\d{1,4}$";
System.out.println(stringIP.matches(pattern));
System.out.println(stringDNS.matches(pattern));

<强>输出

true
false

注意

这里的验证是&#34;宽松&#34;,因为它不会检查这些值,并且最适合4个数字的项目。

要进行更严格的验证(不太可读的模式),请参阅dasblinkenlight的答案。

答案 1 :(得分:2)

public static final String IPV4_REGEX = "\\A(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z";
if(string.matches(IPV4_REGEX)
{
    //....
}

请注意,您发布的“123.345.12.1234”的IP地址不是有效的IPV4地址。

答案 2 :(得分:1)

您的实现会通过一些不代表数字IP地址的字符串。最好使用仅通过有效数字IP地址的正则表达式。正则表达式是taken from here。它有点复杂,因为它需要确保多位数字低于256,但它是验证数字IP地址的可靠方法:

String IPADDRESS_PATTERN = 
    "^([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])$";
if(Pattern.matches(IPADDRESS_PATTERN, stringIP)) {
    ...
}

答案 3 :(得分:1)

验证域字符串是一项更复杂的任务,如果您不介意,可以在项目中添加一个额外的轻量级apache commons库。

查看DomainValidator.isValid(String)

请注意,此方法还会检查有效的公认顶级域名(.com,.org等)。

要验证IP地址,请查看InetAddressValidator.isValidInet4Address(String)