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

f87krz0w  于 2022-11-26  发布在  其他
关注(0)|答案(1)|浏览(169)

格式目标:需要a. b.c. d/x,其中〉〉

  • a是1-3位数字,编号为1-223
  • B、c和d是1-3位数字,必须为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”组的情况下失败

下面是这个怪物被分成了几组,并为我自己的理智/可读性增加了空间://开始字符串,完整组

^(

//一个组,1-223用“”表示。

((?: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}$

(我现在意识到这个逗号是可选的,所以它们可以只用一个空格来分隔。也许我也可以防止这种情况)。

uxhixvfz

uxhixvfz1#

如果格式化模式并添加模式内注解,则更容易看到正则表达式的作用。
以下是您的 * current regex demo *:

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

但是,此正则表达式不仅不精确,而且leads to catastrophic backtracking包含一些长的非匹配字符串。

你的网络掩码模式很好。看起来你在创建一个数字范围正则表达式时遇到了问题。你可以随时求助于在线实用程序,它可以为你生成这些模式,我写了一个并在SO here上分享。
因此,1-223范围的模式为(?:[1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])(您可以手动将其缩减为(?:[1-9]\d?|1\d{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|1\d{2}|2[0-4]\d|25[0-5])
您可以看到,使用这些模式可以解决问题,并使模式具有CA抵抗力:

^(?:
   (?:[1-9]\d?|1\d{2}|2[01]\d|22[0-3])\.         # a group, 1-223 with "."
   (?:(?:[1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])\.){2} # b and c groups 0-255 with "."
   (?:[1-9]?\d|1\d{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

请参阅this regex demo

相关问题