Java 接受一个或多个ip地址的正则表达式模式?

Java 接受一个或多个ip地址的正则表达式模式?,java,regex,Java,Regex,我正在使用下面的正则表达式模式 pattern="^(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))$|\s* 它将接受以下任何一个ip地址 1.1.2.3 or 192.122.134.1 or 198.23.45.56 但我希望它应该接受

我正在使用下面的正则表达式模式

pattern="^(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))$|\s*
它将接受以下任何一个ip地址

1.1.2.3 or 192.122.134.1 or 198.23.45.56 
但我希望它应该接受单一的ip地址以及逗号分隔的ip地址,以及如下所示

1.1.2.3,192.122.134.1,198.23.45.56 
我必须对正则表达式进行哪些更改

([1-9]\d?\d?(\.\d{1,3}){2}\.\d{1,3},?)+
也许有点过分简化,但这应该能解决问题。 (不过,您需要从匹配项中删除逗号) 编辑以将匹配限制在1…*->999*

也许有点过分简化,但这应该能解决问题。 (不过,您需要从匹配项中删除逗号)
编辑以将匹配限制在1…*->999…*

的范围内,我不想像@biziclop所说的那样使用正则表达式

您可以拆分整个
字符串
,并将ip地址传递给该方法。从方法的文档中:

如果提供了文字IP地址,则只检查地址格式的有效性

基本上,您可以将地址传递给这个方法,而类本身将提供地址的验证。如果地址无效,您将遇到一个
java.net.UnknownHostException
,您必须捕获它。这样,您只需创建一个正则表达式,它将成功地拆分所有ip地址

public static void main(String[] args) throws UnknownHostException {
    String adresses = "1.1.2.3.15,192.122.134.1,198.23.45.56";
    for(String s : adresses.split(",|\\sor\\s")) {
        try {
            InetAddress adress = Inet4Address.getByName(s);
        } catch (UnknownHostException e) {
            System.out.println("Invalid format for ip adress " + s);
        }
    }
    adresses = "1.1.2.3 or 192.122.134.1 or 198.23.45.56 ";
    for(String s : adresses.split(",|\\sor\\s")) {
        try {
            InetAddress adress = Inet4Address.getByName(s);
        } catch (UnknownHostException e) {
            System.out.println("Invalid format for ip adress " + s);
        }
    }
}
输出:

Invalid format for ip adress 1.1.2.3.15

我不想像@biziclop所说的那样使用正则表达式

您可以拆分整个
字符串
,并将ip地址传递给该方法。从方法的文档中:

如果提供了文字IP地址,则只检查地址格式的有效性

基本上,您可以将地址传递给这个方法,而类本身将提供地址的验证。如果地址无效,您将遇到一个
java.net.UnknownHostException
,您必须捕获它。这样,您只需创建一个正则表达式,它将成功地拆分所有ip地址

public static void main(String[] args) throws UnknownHostException {
    String adresses = "1.1.2.3.15,192.122.134.1,198.23.45.56";
    for(String s : adresses.split(",|\\sor\\s")) {
        try {
            InetAddress adress = Inet4Address.getByName(s);
        } catch (UnknownHostException e) {
            System.out.println("Invalid format for ip adress " + s);
        }
    }
    adresses = "1.1.2.3 or 192.122.134.1 or 198.23.45.56 ";
    for(String s : adresses.split(",|\\sor\\s")) {
        try {
            InetAddress adress = Inet4Address.getByName(s);
        } catch (UnknownHostException e) {
            System.out.println("Invalid format for ip adress " + s);
        }
    }
}
输出:

Invalid format for ip adress 1.1.2.3.15

慢慢地,它变得难以理解,但你在这里:

^(1-4)第5[0-5]5[0-5]5[0-5]))。((3-d[1-9]d[1-9]d[1-9]d[1-9]第1-9[1-9]d[1-9]d[1-9]第四个州(1-9]d[1-9.[1-9.[1-9]d[1-9]d[1-9]第1-9]d[1-9]d[1-9]1-9]第三个州(1-5[1-5[1-5[1-9]第三个州(1-5[1-5[1-5[0-5[0-5[0-5[0-5[0-5[0-5]))))))))))))((((((((((3[0-4[1-4[1-4[1-4[1-9]d[1|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])。(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])。(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])。(\d|[1-9]\d|d|5[0-5])。)*$

这里发生的是:

让我们调用您的IP regexpIP

IP=(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])。(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])。(\d|[1-9]\d|d|1\d\d|2([0-4]\d|5[0-5])。)

所以我们只需要用逗号重复一下:

^IP(,IP)*$


慢慢地,它变得难以理解,但你在这里:

^(1-4)第5[0-5]5[0-5]5[0-5]))。((3-d[1-9]d[1-9]d[1-9]d[1-9]第1-9[1-9]d[1-9]d[1-9]第四个州(1-9]d[1-9.[1-9.[1-9]d[1-9]d[1-9]第1-9]d[1-9]d[1-9]1-9]第三个州(1-5[1-5[1-5[1-9]第三个州(1-5[1-5[1-5[0-5[0-5[0-5[0-5[0-5[0-5]))))))))))))((((((((((3[0-4[1-4[1-4[1-4[1-9]d[1|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])。(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])。(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])。(\d|[1-9]\d|d|5[0-5])。)*$

这里发生的是:

让我们调用您的IP regexpIP

IP=(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])。(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])。(\d|[1-9]\d|d|1\d\d|2([0-4]\d|5[0-5])。)

所以我们只需要用逗号重复一下:

^IP(,IP)*$

这应该行得通

^((2([0-4]\d|5[0-5])|1\d\d|[0]?[1-9]\d|[0]?[0]?\d)(\.(2([0-4]\d|5[0-5])|1\d\d|
[0]?[1-9]\d|[0]?[0]?\d)){3}([\s,](?!$)|$))*$
它将接受逗号分隔的IP和空格分隔的IP

^((2([0-4]\d|5[0-5])|1\d\d|[0]?[1-9]\d|[0]?[0]?\d)(\.(2([0-4]\d|5[0-5])|1\d\d|
[0]?[1-9]\d|[0]?[0]?\d)){3}([\s,](?!$)|$))*$
<input type="text" name="country_code" pattern="^(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))(,(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])))*$">
它将接受逗号分隔和空格分隔的IP
<input type="text" name="country_code" pattern="^(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))(,(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])).(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5])))*$">
在HTML文件中使用此输入字段




在HTML文件中使用此输入字段

我的建议是完全删除它并正确解析它们。从长远来看,你的生活会轻松得多。也许你可以在逗号上拆分字符串,然后在标记上应用正则表达式。我同意biziclop和Berger的观点。至少:不要重新发明轮子。使用您最喜欢的搜索引擎,查看非常复杂的正则表达式,您实际上需要这些正则表达式来支持构成有效IP地址的各种奇怪内容。@biziclop我从web应用程序表单中获取的输入,如果没有正则表达式,将很难找到它validate@SubodhJoshi相反,它要简单得多。将字符串沿
字符拆分,就得到了各个IP地址。您将它们沿
拆分,并将零件转换为数字,检查它们是否为您提供了有效的IP,您就完成了。作为奖励,您还可以排除有效但可能不需要的IP,如
127.0.0.1
。我的建议是完全摆脱它并正确解析它们。从长远来看,你的生活会轻松得多。也许你可以在逗号上拆分字符串,然后在标记上应用正则表达式。我同意biziclop和Berger的观点。至少:不要重新发明轮子。使用您最喜欢的搜索引擎,查看非常复杂的正则表达式,您实际上需要这些正则表达式来支持构成有效IP地址的各种奇怪内容。@biziclop我从web应用程序表单中获取的输入,如果没有正则表达式,将很难找到它validate@SubodhJoshi相反,它要简单得多。将字符串沿
字符拆分,就得到了各个IP地址。您将它们沿
拆分,并将零件转换为数字,检查它们是否为您提供了有效的IP,您就完成了。作为奖励,您还可以排除有效但可能不需要的IP,如
127.0.0.1
。您的意思是,
0.999.5437891.3.2.500
是一个有效的IP地址列表?它不应该与该模式匹配(现在通过regex101.com运行-它不匹配),但我同意0的问题,我现在就更新。@Minotor请检查这个值
12.12.1.1,
它没有告诉你这个数字有什么问题。我明白你的意思了,它可能有点过分简化了,我会进一步细化它,但我认为我无法将它细化到0.0.0.0之外