基本上,我试图在不使用Java中的外部库的情况下检查String是否是有效的IP地址(它不必是另一端有工作主机的IP;它也可以是未使用的IP)。我无法检查它是否是一个IP地址,因为我也想得到DNS支持。由于以下选项有效:
- 1.2.3.4:55555
- localhost: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个冒号*如果仅包含数字和句点,则必须包含3个且仅包含3个句点、4个数字,并且每个数字必须介于0和255之间*冒号后面的数字是一个介于0和65535 之间的数字
谢谢!
我会使用这样的正则表达式:
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之外的端口号(如果有的话)。我的观点是Regex不是用来测试整数范围的(仍然可能)