Java 用于检查IP的正则表达式
我想检查IP地址是否介于172.16.0.0和172.31.255.255之间 我尝试的是:Java 用于检查IP的正则表达式,java,regex,Java,Regex,我想检查IP地址是否介于172.16.0.0和172.31.255.255之间 我尝试的是: Pattern address = Pattern.compile("172.[16-31].[0-255].[0-255]"); 但它不起作用,编译器会抛出一个错误: Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal character range near index 8 172.[16-31].[
Pattern address = Pattern.compile("172.[16-31].[0-255].[0-255]");
但它不起作用,编译器会抛出一个错误:
Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal character range near index 8
172.[16-31].[0-255].[0-255]
^
因为这是一个练习,所以必须使用正则表达式来完成。这里的一个选项是按周期分割IP地址,然后检查以确保每个组件都在您想要的范围内:
public boolean isIpValid(String input) {
String[] parts = input.split("\\.");
int c1 = Integer.parseInt(parts[0]);
int c2 = Integer.parseInt(parts[1]);
int c3 = Integer.parseInt(parts[2]);
int c4 = Integer.parseInt(parts[3]);
if (c1 == 172 &&
c2 >= 16 && c2 <= 31 &&
c3 >= 0 && c3 <= 255 &&
c4 >= 0 && c4 <= 255) {
System.out.println("IP address is valid.");
return true;
} else {
System.out.println("IP address is not valid.");
return false;
}
}
公共布尔值isIpValid(字符串输入){
String[]parts=input.split(“\\”);
int c1=整数.parseInt(部分[0]);
int c2=整数.parseInt(部分[1]);
int c3=整数.parseInt(部分[2]);
int c4=整数.parseInt(部分[3]);
如果(c1)=172&&
c2>=16&&c2=0&&c3=0&&c4这里的一个选项是按时段分割IP地址,然后检查以确保每个组件都在您想要的范围内:
public boolean isIpValid(String input) {
String[] parts = input.split("\\.");
int c1 = Integer.parseInt(parts[0]);
int c2 = Integer.parseInt(parts[1]);
int c3 = Integer.parseInt(parts[2]);
int c4 = Integer.parseInt(parts[3]);
if (c1 == 172 &&
c2 >= 16 && c2 <= 31 &&
c3 >= 0 && c3 <= 255 &&
c4 >= 0 && c4 <= 255) {
System.out.println("IP address is valid.");
return true;
} else {
System.out.println("IP address is not valid.");
return false;
}
}
公共布尔值isIpValid(字符串输入){
String[]parts=input.split(“\\”);
int c1=整数.parseInt(部分[0]);
int c2=整数.parseInt(部分[1]);
int c3=整数.parseInt(部分[2]);
int c4=整数.parseInt(部分[3]);
如果(c1)=172&&
c2>=16&&c2=0&&c3=0&&c4正则表达式不起作用的原因是字符组[16-31]
意味着
字符1
,介于6
和3
之间的任何字符,或字符1
这绝对不是你想要描述的。用正则表达式语言处理数字是困难的——例如,16到31是(1[6-9]| 2\d | 3[01])
,即“1
后接6
后接9
,2
后接任何数字,或3
后接0
或1
”。您需要一个类似的表达式来描述0..255
范围内的数字:(25[0-5]| 2[0-4]\d |[01]?\d\d?
更好的方法是使用,它有一个解析地址的方法,并允许您使用以下方法检查地址的字节:
byte[]raw=InetAddress.getByName(IPAddressString.getAddress();
布尔valid=raw[0]==172&&raw[1]>=16&&raw[1]正则表达式不起作用的原因是字符组[16-31]
意味着
字符1
,介于6
和3
之间的任何字符,或字符1
这绝对不是你想要描述的。用正则表达式语言处理数字是困难的——例如,16到31是(1[6-9]| 2\d | 3[01])
,即“1
后接6
后接9
,2
后接任何数字,或3
后接0
或1
”。您需要一个类似的表达式来描述0..255
范围内的数字:(25[0-5]| 2[0-4]\d |[01]?\d\d?
更好的方法是使用,它有一个解析地址的方法,并允许您使用以下方法检查地址的字节:
byte[]raw=InetAddress.getByName(IPAddressString.getAddress();
boolean valid=raw[0]==172&&raw[1]>=16&&raw[1]您需要阅读regexp教程来了解[]
的工作原理。它不进行数值范围比较,而是用于匹配单个字符。[16-31]
意味着匹配1
或6
到3
(这没有意义,因为范围必须从低到高)。要匹配16到31之间的数字,它应该是(1[6-9]| 2[0-9]| 3[01])
。虽然你可以用regexp来实现这一点,但我认为这不是最好的方法。将地址拆分为数字,然后用数字比较来检查它们的范围。你是在用锤子敲开螺母。这基本上是一个数字问题,而不是字符串/正则表达式问题。你需要阅读regexp教程来了解[]
有效。它不进行数字范围比较,而是用于匹配单个字符。[16-31]
表示匹配1
或6
到3
范围内的单个字符(这没有意义,因为范围必须从低到高)。要匹配从16到31的数字,它应该是(1)[6-9]|2[0-9]|3[01])
。虽然你可以用regexp实现这一点,但我认为这不是最好的方法。将地址拆分为数字,然后用数字比较检查它们的范围。你是在用锤子敲碎螺母。这基本上是一个数字问题,而不是字符串/正则表达式问题。谢谢你的回答。我明白了这更简单的一点但是因为这是一个练习,我必须用正则表达式来做。谢谢你的回答。我明白这很容易,但因为这是一个练习,我必须用正则表达式来做。为了完整性,数字之间的句点应该在前面用斜线转义。没有斜线的句点表示任何字符,并且允许任何字符出现。对于completeteness,数字之间的句点应在前面加斜线转义。没有斜线的句点表示任何字符,并且允许任何字符出现。