带网络掩码的IP地址正则表达式



格式目标:需要a.b.c.d/x在祝辞祝辞

  • a是1-3位数字btw 1-223
  • b、c、d为1-3位数字,btw 0 ~ 255, *必填
  • x为8 ~ 32位的1位或2位数字,(/x)组是可选的

这是我现在的完整正则表达式:

^(((?:22[0-3]|2([0-1])?d?|([1-9][0-9]?|1[0-9]{2})).)((?:25[0-5]|2[0-4]d|[01]?(d{0,2})).){2}((25[0-5]|2[0-4]d|[01]?(d{0,2}))(/([89]|[12]d|3[0-2]))?),?s?){1,50}$

**我遇到的问题是:如果"1.1.1."输入(也就是没有'd'组),它正在通过验证。我希望它在没有'd'组的情况下失败**

下面是这个怪物被分成几组,并且为了我自己的理智和可读性添加了空格://start string, full group

^(

//a group, 1-223 and ">

((?:22[0-3]|2([0-1])?d?|([1-9][0-9]?|1[0-9]{2})).)

//b和c组0-255,使用";

((?:25[0-5]|2[0-4]d|[01]?(d{0,2})).){2}

//d组,以可选的网络掩码结束,而不是"//我试着把这个组设为非可选来解决我的问题。

((25[0-5]|2[0-4]d|[01]?(d{0,2}))

//子网掩码

(/([89]|[12]d|3[0-2]))?)

//允许逗号分隔,可选空格,最多50个ip

,?s?){1,50}$

(我现在意识到这个逗号是可选的,所以它们可以只用一个空格分开。也许我也可以阻止那件事)。

如果您格式化模式并添加模式内注释,则更容易看到regex的作用。

这是你的当前的正则表达式演示:

^(
((?:22[0-3]|2([0-1])?d?|([1-9][0-9]?|1[0-9]{2})).) # a group, 1-223 with "."
((?:25[0-5]|2[0-4]d|[01]?(d{0,2})).){2} # b and c groups 0-255 with "."
((25[0-5]|2[0-4]d|[01]?(d{0,2})) # d group, ends with optional netmask instead of "." // i tried making this non-optional as a group to solve my problem.
(/([89]|[12]d|3[0-2]))?) # netmask
,?s?){1,50}$ # allow comma separated, optional space between, up to 50 IPs

然而,这个正则表达式不仅不精确,它还会导致一些不匹配的长字符串的灾难性回溯。

你的网掩码模式是好的。似乎您在创建数字范围正则表达式时遇到了问题。你总是可以求助于可以为你生成这些模式的在线实用程序,我写了一个并在这里分享给SO。

因此,1-223范围的模式是(?:[1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])(您可以手动将其减少到(?:[1-9]d?|1d{2}|2[01]d|22[0-3])), 0-255范围的模式是(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(减少到(?:[1-9]?d|1d{2}|2[0-4]d|25[0-5]))

您可以看到,使用这些模式解决了这个问题,并使模式抵抗ca:

^(?:
(?:[1-9]d?|1d{2}|2[01]d|22[0-3]).         # a group, 1-223 with "."
(?:(?:[1-9]?d|1d{2}|2[0-4]d|25[0-5]).){2} # b and c groups 0-255 with "."
(?:[1-9]?d|1d{2}|2[0-4]d|25[0-5])          # d group, ends with optional netmask instead of "."
(?:/(?:[89]|[12]d|3[0-2]))?                 # netmask
,?s?                                         # allow comma separated, optional space between
){1,50}$                                         # up to 50 IPs

查看这个正则表达式演示。

最新更新