Java Regex String:检查ip:port字符串是否包含有效的IPv4或DNS地址

时间:2016-03-27 13:31:50

标签: java regex dns

基本上,我试图在不使用Java的外部库的情况下检查String是否是有效的IP地址(它不必是另一端有工作主机的IP;它可以也是一个未使用过的人)。我无法检查它是否是IP地址,因为我也想要DNS支持。由于以下选项有效:

  • 1.2.3.4:55555
  • 本地主机:1
  • google.com:12345
  • 1.2.abc:54321(这有效吗?)

但以下内容无效:

  • 1.2.3.4(无端口)
  • 1.2:34(不是IP地址)
  • 当地主持人:12345(空格)
  • 8.8.8.8:abc(不是端口插槽中的数字)
  • stackoverflow.com:234.5(基本上只有数字应该遵循:
  • localhost:65536(端口号越界)

此时(我会继续更新),我会做以下检查:

host != null;
!host.contains(" ");
host.contains(":");

我认为可以做其他检查,但我不知道该怎么办:

*包含1个且仅包含1个冒号 *如果只包含数字和句点,则必须包含3个且仅包含3个句点,4个数字,每个数字必须介于0到255之间 *冒号后面的数字是一个数字,介于0和65535之间

谢谢!

1 个答案:

答案 0 :(得分:5)

我会使用这样的正则表达式:

import java.util.regex.Pattern;

public class IpCheck {

    public static void main(String[] args) {

        Pattern p = Pattern.compile("^"
                + "(((?!-)[A-Za-z0-9-]{1,63}(?<!-)\\.)+[A-Za-z]{2,6}" // Domain name
                + "|"
                + "localhost" // localhost
                + "|"
                + "(([0-9]{1,3}\\.){3})[0-9]{1,3})" // Ip
                + ":"
                + "[0-9]{1,5}$"); // Port

        System.out.println(p.matcher("1.2.3.4:55555").matches());
        System.out.println(p.matcher("localhost:1").matches());
        System.out.println(p.matcher("google.com:12345").matches());
        System.out.println(p.matcher("1.2.abc:54321").matches());

        System.out.println(p.matcher("1.2.3.4").matches());
        System.out.println(p.matcher("1.2:34").matches());
        System.out.println(p.matcher("local host:12345").matches());
        System.out.println(p.matcher("stackoverflow.com:234.5").matches());
        System.out.println(p.matcher("localhost:65536").matches());

    }

}

打印:

true
true
true
true
false
false
false
false
true

它的工作原理除了端口范围之外,为此我建议您提取端口号(如果有的话),并在正则表达式之外。我的观点是,Regex不是为了测试整数范围(仍然可能)