gpt4 book ai didi

c++ - 用于封装 v4 子网掩码和 v6 前缀长度的正则表达式

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:57:21 24 4
gpt4 key购买 nike

我想要一个可以同时封装 ipv4 子网掩码和 ipv6 前缀 length(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]?))"

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

最佳答案

您现在可能已经解决了这个问题,但是您的正则表达式唯一真正的问题是您没有指定边界。因此,正如您在评论中所说,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

(?<=/)是一个积极的回顾。它确保匹配前面有一个 /。 .请注意,这是一个零长度断言,这意味着它不计为匹配的一部分,因此您的匹配仍将只包含子网号。

关于c++ - 用于封装 v4 子网掩码和 v6 前缀长度的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16438723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com