如何编写验证/1至/128前缀IPv6子网掩码的正则表达式?
IPv6子网掩码正则验证方案
要验证符合前缀/1到/128的IPv6子网掩码(即二进制前n位全1、后128-n位全0,对应范围从8000::到ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff),核心是确保掩码的十六进制表示只有前导连续的1段和后续连续的0段,不允许中间出现混合的1和0(比如cf01::这种无效格式)。
以下是精准匹配的正则表达式,覆盖所有有效场景:
^(?: # 前缀1-15位:单个"部分全1"组 + 末尾0段压缩 (?:8000|c000|e000|f000|f800|fc00|fe00|ff00|ff80|ffc0|ffe0|fff0|fff8|fffc|fffe)::| # 前缀16位:单个全1组 + 末尾0段压缩 ffff::| # 前缀17-111位:N个全1组 + 1个"部分全1"组 + 末尾0段压缩(N=1~6) (?:ffff:){1,6}(?:8000|c000|e000|f000|f800|fc00|fe00|ff00|ff80|ffc0|ffe0|fff0|fff8|fffc|fffe)::| # 前缀32-112位(16的倍数):N个全1组 + 末尾0段压缩(N=2~7) (?:ffff:){2,7}::| # 前缀113-128位:7个全1组 + 最后1个"部分全1"或全1组(无0段可压缩) (?:ffff:){7}(?:8000|c000|e000|f000|f800|fc00|fe00|ff00|ff80|ffc0|ffe0|fff0|fff8|fffc|fffe|ffff) )$
关键逻辑说明
- "部分全1"组定义:每个16位的组中,前s位(1≤s≤15)全1、后16-s位全0,对应的十六进制值固定为
8000(s=1)、c000(s=2)、e000(s=3)、f000(s=4)、f800(s=5)、fc00(s=6)、fe00(s=7)、ff00(s=8)、ff80(s=9)、ffc0(s=10)、ffe0(s=11)、fff0(s=12)、fff8(s=13)、fffc(s=14)、fffe(s=15),这些值是唯一符合连续1规则的部分全1组。 - 压缩规则兼容:仅允许用
::压缩末尾的连续0段,不允许中间压缩(比如ffff::ffff这类中间有0的格式会被自动排除)。 - 覆盖所有前缀范围:从/1到/128的所有合法前缀对应的掩码都被包含,无效格式(如
cf01::)因不符合"部分全1"组的定义,不会被匹配。
使用注意事项
- 正则支持IPv6的大小写不敏感特性,使用时可添加
i标志(如JavaScript中/regex/i),无需额外处理大小写问题。 - 若需要在不支持多行正则的环境中使用,可去掉换行和注释,合并为单行:
^(?:(?:8000|c000|e000|f000|f800|fc00|fe00|ff00|ff80|ffc0|ffe0|fff0|fff8|fffc|fffe)::|ffff::|(?:ffff:){1,6}(?:8000|c000|e000|f000|f800|fc00|fe00|ff00|ff80|ffc0|ffe0|fff0|fff8|fffc|fffe)::|(?:ffff:){2,7}::|(?:ffff:){7}(?:8000|c000|e000|f000|f800|fc00|fe00|ff00|ff80|ffc0|ffe0|fff0|fff8|fffc|fffe|ffff))$
内容的提问来源于stack exchange,提问作者Kalib Zen
相关产品推荐
相关产品推荐

