• 常用正则表达式-IP地址


    常用正则表达式-IP地址

    1. IPv4地址

    1. IPv4地址定义

    参考百度百科

    IPv4使用32位(4字节)地址,因此地址空间中只有4,294,967,296(即2的32次方)个地址。

    通常使用点分十进制进行表示方法,如0.0.0.0-255.255.255.255。

    2. IPv4地址的正则表达式

    一个合法的IPv4地址由4组数字组成,每组数字之间以.隔开,数字的取值范围为0-255。每组数字的总结如下:

    范围描述正则表达式
    0-91位数字\d
    10-992位数字[1-9]\d
    100-199以1开头的3位数字1\d{2}
    200-249以2开头,第2位是0-4的3位数字2[0-4]\d
    250-25525开头,第3位是0-5的3位数字25[0-5]

    所以每组数字的正则表达式为:

    (\d)|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5])
    
    • 1

    注:每种情况务必加上(),因为元字符|对邻接的字符/字符集/子表达式都起作用。
    进而,IPv4的完整正则表达式为:

    (((\d)|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d)|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5]))
    
    • 1

    对应java代码的正则为:

    String IP_V4 = "^(((\\d)|([1-9]\\d)|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))\\.){3}((\\d)|([1-9]\\d)|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))$"
    
    • 1

    3. 对应java代码

    IPValidator.java

    package com.ysx.utils.pattern;
    
    import java.util.regex.Pattern;
    
    /**
     * @author youngbear
     * @email youngbear@aliyun.com
     * @date 2022-09-04 17:54
     * @blog ...
     * @github ...
     * @description IP校验
     */
    public class IPValidator {
    
        private static final String IP_V4 = "^(((\\d)|([1-9]\\d)|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))\\.){3}((\\d)|([1-9]\\d)|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))$";
        // 下边这个正则也ok
        // private static final String IP_V4 = "^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$";
        private static final Pattern IP_V4_PATTERN = Pattern.compile(IP_V4);
    
        /**
         * 是否是有效的ipv4地址
         *
         * @param input 字符串
         * @return 是否是有效的ipv4地址
         */
        public static boolean isValidIpv4(String input) {
            if (input == null) {
                return false;
            }
            return IP_V4_PATTERN.matcher(input).matches();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    使用junit5单元测试:IPValidatorTest.java

    package com.ysx.utils.pattern;
    
    import org.junit.jupiter.params.ParameterizedTest;
    import org.junit.jupiter.params.provider.MethodSource;
    
    import java.util.stream.Stream;
    
    import static org.junit.jupiter.api.Assertions.assertFalse;
    import static org.junit.jupiter.api.Assertions.assertTrue;
    
    /**
     * @author youngbear
     * @email youngbear@aliyun.com
     * @date 2022-09-04 17:58
     * @blog ...
     * @github ...
     * @description
     */
    public class IPValidatorTest {
    
        @ParameterizedTest(name = "#{index} - Run test with IPv4 = {0}")
        @MethodSource("validIPv4Provider")
        void test_ipv4_regex_valid(String ipv4) {
            assertTrue(IPValidator.isValidIpv4(ipv4));
        }
    
        @ParameterizedTest(name = "#{index} - Run test with IPv4 = {0}")
        @MethodSource("invalidIPv4Provider")
        void test_ipv4_regex_invalid(String ipv4) {
            assertFalse(IPValidator.isValidIpv4(ipv4));
        }
    
        static Stream<String> validIPv4Provider() {
            return Stream.of(
                    "0.0.0.0",
                    "0.0.0.1",
                    "127.0.0.1",
                    "1.2.3.4",              // 0-9
                    "11.1.1.0",             // 10-99
                    "101.1.1.0",            // 100-199
                    "201.1.1.0",            // 200-249
                    "255.255.255.255",      // 250-255
                    "192.168.1.1",
                    "192.168.1.255",
                    "100.100.100.100");
        }
    
        static Stream<String> invalidIPv4Provider() {
            return Stream.of(
                    "000.000.000.000",          // leading 0
                    "00.00.00.00",              // leading 0
                    "1.2.3.04",                 // leading 0
                    "1.02.03.4",                // leading 0
                    "1.2",                      // 1 dot
                    "1.2.3",                    // 2 dots
                    "1.2.3.4.5",                // 4 dots
                    "192.168.1.1.1",            // 4 dots
                    "256.1.1.1",                // 256
                    "1.256.1.1",                // 256
                    "1.1.256.1",                // 256
                    "1.1.1.256",                // 256
                    "-100.1.1.1",               // -100
                    "1.-100.1.1",               // -100
                    "1.1.-100.1",               // -100
                    "1.1.1.-100",               // -100
                    "1...1",                    // empty between .
                    "1..1",                     // empty between .
                    "1.1.1.1.",                 // last .
                    "");                        // empty
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    源代码地址

    参考

    1. Java IP Address (IPv4) regex examples

    其他的ipv4地址的正则及问题

    有问题的

    // https://juejin.cn/post/6844903768232820749
    // 有问题 00.00.00.00 认为是有效的
    String IP_V4 = "^(((\\d{1,2})|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))\\.){3}((\\d{1,2})|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))$";
    
    // http://www.java2s.com/example/java/java.util.regex/is-ipv4-address-by-regex.html
    // -- 有问题 000.000.000.000 认为是合法的
    String IPV4_PATTERN ="^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$"
    // https://mkyong.com/regular-expressions/how-to-validate-ip-address-with-regular-expression/
    String IPV4_PATTERN ="^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\\.(?!$)|$)){4}$"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    正确的:

    // https://mkyong.com/regular-expressions/how-to-validate-ip-address-with-regular-expression/  
      // 25[0-5]        = 250-255
      // (2[0-4])[0-9]  = 200-249
      // (1[0-9])[0-9]  = 100-199
      // ([1-9])[0-9]   = 10-99
      // [0-9]          = 0-9
      // (\.(?!$))      = can't end with a dot
      private static final String IPV4_PATTERN_SHORTEST =
              "^((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(\\.(?!$)|$)){4}$";      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    RabbitMQ 消息中间件
    AC修炼计划(AtCoder Regular Contest 166)
    JavaScript的路由
    Redis优化之单作品数据缓存
    C++项目——云备份-④-服务端配置信息模块设计与实现
    RabbitMQ死信队列、延时队列
    【Zabbix监控二】之zabbix自定义监控内容案例(自动发现、自动注册)
    ELF header
    深度神经网络——什么是线性回归?
    机器人控制器编程实践指导书旧版-实践四 步进电机(执行器)
  • 原文地址:https://blog.csdn.net/Next_Second/article/details/126696589