在Java中验证IPv4地址

iRu*_*ner 59 java ip-address

我想使用Java验证IPv4地址.它应该使用点十进制表示法编写,因此它应该有3个点(" ."),没有字符,点之间的数字,数字应该在有效范围内.应该怎么做?

Nec*_*net 87

使用正则表达式非常简单(但请注意,这比使用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();
}
Run Code Online (Sandbox Code Playgroud)

基于Mkyong的帖子

  • 那些奇怪格式的IP地址怎么样,比如127.1(相当于127.0.0.1)?IPv6怎么样? (6认同)
  • 你的正则表达式的一个潜在问题是它似乎与010.020.030.040匹配,但这可能有问题,因为以0开头的数字通常可以解释为八进制数. (2认同)

wor*_*pet 52

尝试InetAddressValidator实用程序类.

文件在这里:

http://commons.apache.org/validator/apidocs/org/apache/commons/validator/routines/InetAddressValidator.html

在这里下载:

http://commons.apache.org/validator/

  • 为这些东西使用已经编写的实用程序总是更好 (14认同)

wil*_*ote 21

使用Guava的InetAddresses.forString()

InetAddresses.isInetAddress(ipStr)
Run Code Online (Sandbox Code Playgroud)


Aka*_*Wal 10

你可以使用这个功能 -

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这是对我唯一的作品。其他正则表达式模式都忽略了前导0的情况,这对于IPv4是非法的。 (2认同)

mdm*_*dma 9

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

(([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]))
Run Code Online (Sandbox Code Playgroud)

这个验证了值在范围内.

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();
   }
}
Run Code Online (Sandbox Code Playgroud)

为避免反复重新编译模式,最好放置Pattern.compile()调用,使其仅执行一次.


Jas*_*n C 7

还有一个未记录的实用程序类sun.net.util.IPAddressUtil,您实际上不应该使用它,尽管它可能在快速的一次性丢弃实用程序中很有用:

boolean isIP = IPAddressUtil.isIPv4LiteralAddress(ipAddressString);
Run Code Online (Sandbox Code Playgroud)

在内部,这是实用程序类InetAddress用于解析IP地址.

请注意,对于像"123"这样的字符串,这将返回true,这些字符串在技术上是有效的IPv4地址,而不是点十进制表示法.