我想使用正则表达式验证带有或不带有端口号的 IP 地址。我的输入字符串将是IP:PORT
或只是IP
. 我只想要一个regex
将要验证的IP:PORT
或IP
两者兼而有之。
我的 IP 地址正则表达式是:
^(?:(?:1\d?\d|[1-9]?\d|2[0-4]\d|25[0-5])\.){3}(?:1\d?\d|[1-9]?\d|2[0-4]\d|25[0-5])$
有人可以让我知道如何向这个现有的正则表达式添加可选的端口号吗?
我想使用正则表达式验证带有或不带有端口号的 IP 地址。我的输入字符串将是IP:PORT
或只是IP
. 我只想要一个regex
将要验证的IP:PORT
或IP
两者兼而有之。
我的 IP 地址正则表达式是:
^(?:(?:1\d?\d|[1-9]?\d|2[0-4]\d|25[0-5])\.){3}(?:1\d?\d|[1-9]?\d|2[0-4]\d|25[0-5])$
有人可以让我知道如何向这个现有的正则表达式添加可选的端口号吗?
为什么这么复杂:谷歌:http ://answers.oreilly.com/topic/318-how-to-match-ipv4-addresses-with-regular-expressions/
您还试图在一个地方做太多事情。将正则表达式用于它的优点,然后在正则表达式不是正确工具的地方使用其他智能。在您的情况下,不要尝试在正则表达式中验证 IP 地址的值范围,而是在后处理中:
.... ^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})(:(\d{1,5}))?$
byte[] ip = new byte[4];
for (int i = 1; i <= 4; i++) {
int bt = Integer.parseInt(matcher.group(i));
if (bt < 0 || bt > 255) {
throw new IllegalArgumentException("Byte value " + bt + " is not valid.");
}
ip[i-1] = (byte)bt;
}
integer port = 0;
if (matcher.group(6) != null) {
port = Integer.parseInt(matcher.group(6));
}
这行得通。
^(?:(?:1\d?\d|[1-9]?\d|2[0-4]\d|25[0-5])\.){3}(?:1\d?\d|[1-9]?\d|2[0-4]\d|25[0-5])(?:[:]\d+)?$
类解决方案{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
String IP = in.next();
System.out.println(IP.matches(new MyRegex().pattern));
}
}
}
类我的正则表达式 {
String 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])$";
}
私有静态最终字符串 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])$";
我从这个网站使用了这个解决方案:
https://www.mkyong.com/regular-expressions/how-to-validate-ip-address-with-regular-expression/
使用尾随?
标记可选部分,即添加(:\\d+)
到正则表达式的末尾。