【问题标题】:regex for encapsulating v4 subnet mask and v6 prefix length用于封装 v4 子网掩码和 v6 前缀长度的正则表达式
【发布时间】:2026-02-15 20:00:01
【问题描述】:

我想要一个可以同时封装 ipv4 子网掩码和 ipv6 前缀长度(1-128)的正则表达式。 我正在考虑扩展以下 ptype 以包括前缀长度 PTYPE 名称="IP_ADDR"

pattern="(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))"
help="IP address AAA.BBB.CCC.DDD where each part is in the range 0-255"/>

新模式看起来像这样。

pattern="((((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)) | (12[0-8]| 1[01][0-9] | [01]?[0-9][0-9]?))"

上面的模式对吗?有人可以建议一种更好的方式来编写模式吗?

【问题讨论】:

  • 如果您已经不知道它是否正确,那可能暗示这是错误的方法。如果这是正确的,我什至不会尝试去解决。我见过更糟糕的情况,但你认为要多久才会有其他人出现并且必须理解它,或者更糟的是,改变它?
  • 我是新手,这是我写的第一个正则表达式。不确定它是否会起作用
  • @SumitDas: www.rubular.com
  • (((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){ 3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(12[0-8]|1[ 01][0-9]|([1-9][0-9]?)
  • 300 也被上述表达式接受。我相信这是由于 ([1-9][0-9]? 在表达式的末尾。我的意图是允许单个数字 [1-9] 或两位数字 [1-99] 。谁能说出为什么 300 也被接受以及解决方法?

标签: c++ regex networking


【解决方案1】:

您现在可能已经弄清楚了,但是您的正则表达式唯一真正的问题是您没有指定边界。因此,正如您在 cmets 中所说,300 将导致匹配。这是因为它与 30 匹配。如果您添加了单词边界 \b,那么您的匹配将起作用:

\b(12[0-8]|1[01][0-9]|([1-9][0-9]?))\b

将只匹配 1 到 128。这是有效的,因为它只允许匹配在匹配之前有单词边界的情况下成功。 300 现在失败了,因为 30 后面是 0 而不是单词边界。

我将其简化为:

\b([1-9][0-9]?|[1][0-2][0-8])\b

如果是 ipv6 地址,格式如下:

<address>/<subnet mask>

那么上面的正则表达式仍然可以工作,因为 / 不是一个单词字符(是一个边界)。但是,如果你特别想检查前面的/,那么你会这样做:

(?<=/)([1-9][0-9]?|[1][0-2][0-8])\b

(?&lt;=/) 是一个积极的回顾。它确保匹配以/ 开头。请注意,它是一个零长度断言,这意味着它不计入匹配的一部分,因此您的匹配仍然只包含子网号。

【讨论】: