如何编写单正则验证前缀/1-128的IPv6子网掩码?
合并IPv6子网掩码(/1至/128)的正则表达式方案
当然可以将原有的两个正则逻辑合并为一个。以下是整合后的正则表达式,兼容IPv6的压缩格式(::),能精准匹配所有前缀长度1到128的合法IPv6子网掩码(即从8000::到ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff的连续1位掩码):
^(?:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff|(?:(?:ffff:){0,6}(?:[89ab][0-9a-f]{3}|[cdef][0-9a-f]{3}|f[89ab][0-9a-f]{2}|f[cdef][0-9a-f]{2}|ff[89a-f][0-9a-f]|ff[0-7][0-9a-f]|fff[8-f]|fff[0-7])(?::(?:0{4}:){0,6}0{4}|::)|::(?:ffff:){0,6}(?:[89ab][0-9a-f]{3}|[cdef][0-9a-f]{3}|f[89ab][0-9a-f]{2}|f[cdef][0-9a-f]{2}|ff[89a-f][0-9a-f]|ff[0-7][0-9a-f]|fff[8-f]|fff[0-7])|(?:ffff:){1,5}::(?:0{4}:){0,5}(?:[89ab][0-9a-f]{3}|[cdef][0-9a-f]{3}|f[89ab][0-9a-f]{2}|f[cdef][0-9a-f]{2}|ff[89a-f][0-9a-f]|ff[0-7][0-9a-f]|fff[8-f]|fff[0-7]))$
逻辑说明
这个正则通过|将两种核心场景合并:
- 全FFFF掩码:直接匹配
ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff,对应/128的掩码。 - 前缀长度1-127的掩码:覆盖所有包含连续1位的非全F掩码,同时处理IPv6的压缩格式:
- 无压缩的完整格式:比如
ffff:8000:0000:0000:0000:0000:0000:0000(/17)。 - 末尾压缩:比如
ffff:8000::(/17)。 - 开头压缩:比如
::8000:0000:0000:0000:0000:0000:0000:0000(/1)。 - 中间压缩:比如
ffff:ffff::ff80:0000:0000:0000:0000(/31)。
- 无压缩的完整格式:比如
其中,[89ab][0-9a-f]{3}这类字符类专门匹配包含连续1位的十六进制段——比如8000对应最高位1,ff80对应前15位1,确保掩码的1位是连续的,排除非合法的掩码格式。
额外提示
- 正则默认不区分大小写,若需要严格匹配小写或大写,可移除字符类中对应的大小写字母,或启用正则引擎的大小写敏感模式。
- 所有非连续1位的“伪掩码”(比如
ffff:0000:ffff:...)都会被该正则排除,保证匹配的精准性。
内容的提问来源于stack exchange,提问作者heer shah
相关产品推荐
相关产品推荐

