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

时间:2013-05-08 10:48:37

标签: c++ regex networking

我想要一个可以封装ipv4子网掩码和ipv6前缀长度(1-128)的正则表达式。 我正在考虑扩展以下ptype以包括前缀长度 PTYPE name =“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]?))"

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

1 个答案:

答案 0 :(得分:0)

你现在可能已经想到了这一点,但你的正则表达式唯一真正的问题是你没有指定边界。所以,正如你在评论中所说,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

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

相关问题