【问题标题】:ip address in java valid or notjava中的ip地址是否有效
【发布时间】:2013-04-30 09:43:26
【问题描述】:

我想使用正则表达式验证带有或不带有端口号的 IP 地址。我的输入字符串是IP:PORT 或只是IP。我只想要一个 regex 来验证 IP:PORTIP 两者。

我的 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 正则表达式是好的:^(?:(?: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{2,5})?$
  • 两件事:有代码时使用 (`) 符号,而不是换行。其次,在这种情况下,最好的解决方案是根本不使用正则表达式。
  • ... 或使用正则表达式进行解析,以及另一种机制来验证 IP 组件值。 Google 为 IP 搜索好的正则表达式:answers.oreilly.com/topic/…

标签: java regex validation ip-address port-number


【解决方案1】:

为什么这么复杂:谷歌: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));
}

【讨论】:

    【解决方案2】:

    这行得通。

    ^(?:(?: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+)?$ 
    

    【讨论】:

    • 现已编辑。您可以使用 regextester.com
    【解决方案3】:

    类解决方案{

    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));
    
        }
    
    
    
    }
    

    }

    类 MyRegex {

                                               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/

    【讨论】:

      【解决方案4】:

      使用尾随? 标记可选部分,即将(:\\d+) 添加到正则表达式的末尾。

      【讨论】:

      • 你能在我的正则表达式中添加端口验证吗?主要的事情我不明白如何在现有的中添加可选的东西?
      猜你喜欢
      • 2011-10-07
      • 2019-03-22
      • 1970-01-01
      • 2011-04-09
      • 2015-08-06
      • 2016-12-01
      • 2011-02-05
      • 1970-01-01
      • 2017-10-30
      相关资源
      最近更新 更多