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

3

我正在尝试区分两种不同类型的字符串,即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.
}

第一个 stringIP 是无效的,因为它在最后一组中有四个数字。 - Sergey Kalinichenko
是的,我只是想表达我的意图,谢谢。 - Guenevere
你难道分不清字母和数字吗? - user2173738
4个回答

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

注意

这里的验证是“宽容”的,因为它不会检查值,并且将您的示例与最多4位数字项匹配。

要进行更严格的验证(缺点是模式不太易读),请参见dasblinkenlight的回答。


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)
{
    //....
}

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


这个很好地解决了我的问题,我知道它并不合法,但我想表达的是我的意图,谢谢! - Guenevere

1

1
你的实现会放过一些不代表数字IP地址的字符串。最好使用一个正则表达式,只通过有效的数字IP地址。该正则表达式是从这里获取。它有点复杂,因为它需要确保多位数在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)) {
    ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接