首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于封装v4子网掩码和v6前缀长度的正则表达式

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

Stack Overflow用户
提问于 2013-05-08 18:48:37
回答 1查看 1.1K关注 0票数 2

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

代码语言:javascript
复制
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"/>

新的模式看起来像这样。

代码语言:javascript
复制
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]?))"

上面的模式正确吗?有人能建议一种更好的方式来编写模式吗?

EN

回答 1

Stack Overflow用户

发布于 2014-01-26 20:20:51

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

代码语言:javascript
复制
\b(12[0-8]|1[01][0-9]|([1-9][0-9]?))\b

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

我会将其简化为:

代码语言:javascript
复制
\b([1-9][0-9]?|[1][0-2][0-8])\b

对于格式为:的ipv6地址:

代码语言:javascript
复制
<address>/<subnet mask>

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

代码语言:javascript
复制
(?<=/)([1-9][0-9]?|[1][0-2][0-8])\b

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16438723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档