【问题标题】:IP Address regex with netmasks带网络掩码的 IP 地址正则表达式
【发布时间】:2022-11-22 17:52:37
【问题描述】:

格式目标: 要求a.b.c.d/x哪里>>

  • a是1-223之间的1-3位数字
  • b、c、d为0-255之间的1-3位数字,*必填
  • 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' 组的情况下失败 **

这是为了我自己的理智/可读性而分成几组的怪物,并添加了空格: // 开始字符串,完整组

^(

// a group, 1-223 with "."

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

// b and c groups 0-255 with "."

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

// d group, ends with optional netmask instead of "." // i tried making this non-optional as a group to solve my problem.

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

// netmask

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

// allow comma separated, optional space between, up to 50 IPs

,?\s?){1,50}$

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

【问题讨论】:

  • 更新版本...我认为解决了这个 ^(((22[0-3]|2([0-1])?\d?|([1-9][0-9]?|1[0-9]{2}))\.)((25[0-5]|2[0-4]\d|([0-9][0-9]?|1[0-9]{2}))\.){2}((25[0-5]|2([0-1])?\d?|([0-9][0-9]?|1[0-9]{2}))(\/([89]|[12]\d|3[0-2]))?),?\s?){1,50}$ << 问题是 b 和 c 部分中的 [01]?(\d{0,2}。他们使整个数字成为“可选”,因为有人在使用 ?一个允许 0 位数字。

标签: regex expression ip-address


【解决方案1】:

如果您格式化模式并添加模式内 cmet,则更容易看到您的正则表达式的作用。

这是你的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?|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

参见this regex demo

【讨论】:

  • 谢谢wiktor,看到它清理干净真的很有帮助。我在工作时意识到它可能会得到显着优化,而你正是这样做的。抗CA是什么意思?
  • @iamhill 灾难性的回溯抵抗。
【解决方案2】:

这对我有用...

192.168.1.1/32
0.0.0.0
255.255.255.255
256.256.256.256
999.999.999.999
1.2.3
1.2.3.4
127.0.0.1/24

(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}/([8-9]|[12][0-9]|3[0-2])

【讨论】:

  • 请阅读How to Answeredit 你的答案,以解释为什么这段代码实际上会解决手头的问题。永远记住,您不仅在解决问题,而且还在教育 OP 和这篇文章的任何未来读者。
猜你喜欢
  • 2021-10-26
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
相关资源
最近更新 更多