我想要一个可以封装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]?))"
以上模式是对的吗?有人可以建议更好的方式来编写模式吗?
答案 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
(?<=/)
是一个积极的看法。它确保匹配前面有/
。请注意,它是一个零长度断言,这意味着不计入匹配的一部分,因此您的匹配仍将只包含子网号。