Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于检查IP的正则表达式_Java_Regex - Fatal编程技术网

Java 用于检查IP的正则表达式

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].[

我想检查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].[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,数字之间的句点应在前面加斜线转义。没有斜线的句点表示任何字符,并且允许任何字符出现。