我想要一个可以同时封装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]?))"上面的模式正确吗?有人能建议一种更好的方式来编写模式吗?
发布于 2014-01-26 20:20:51
到目前为止,您可能已经弄清楚了这一点,但是您的正则表达式唯一真正的问题是您没有指定边界。因此,正如您在评论中所说,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(?<=/)是一个积极的回溯。它确保匹配之前有一个/。请注意,这是一个零长度断言,这意味着不会将其计入匹配的一部分,因此您的匹配仍将仅包含子网编号。
https://stackoverflow.com/questions/16438723
复制相似问题