4

我正在尝试构建一个正则表达式,其中一个子序列预计会在整个比赛的不同场景中出现。一个类似的例子是I/P地址:对于输入字符串blah129.186.51.101blah,匹配是:129.186.51.101但是子序列129、186、51和101每个都满足它们落在0和255之间的匹配条件(简单条件)。所以我的正则表达式最终是这样的:

(?:{regexp for 0 to 255}\.){3}({regexp for 0 to 255})

是否有更优雅的方法来处理正则表达式可以具有较小的正则表达式片段的情况,这些片段可以在整个正则表达式中再次引用?

4

3 回答 3

3

也许你可以试试这个:

((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?!\d)\.??){4}

虽然这在特殊情况下会失败blah129.186.51.1011blah,但我认为这应该是失败匹配,因为它不是有效的 ip?

于 2013-06-11T06:28:29.003 回答
2

这将解决您的问题:

((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?!\d)\.??){4}

锚定(见测试结果):

^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$

试验结果:

// Valid IP addresses
// 1.2.3.4
// 255.255.255.255

// Invalid IP addresses
// 1.2.3
// 1.2.3.
// .1.2.3
// 1.2.3.4.5.6.7.8 (use anchors ^ and $ to skip these if needed, since 1.2.3.4 and 5.6.7.8 will still be captured)
// 999.999.999.999 
// 299.299.299.299
// 001.002.003.004 (these use octal notation, not decimal)

锚定的正则表达式不会匹配文本内部,只有当您想要对只应包含 IP 的字符串进行非常严格的匹配时

更新:

现场结果在这里

于 2013-06-11T07:39:38.610 回答
1

另外,看看这个模式:(也能够匹配前导零

((?:(?:0?\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])\.){3}(?:1\d{2}|2[0-4]\d|25[0-5]|0?\d{1,2}))

活生生的例子

编辑

我已经建议了一个正则表达式,但我永远不会建议你使用正则表达式来做到这一点。您应该使用SPLIT函数并迭代索引并将其与 0 到 255 之间的范围进行比较。请参阅我在顶部的评论。

关于正则表达式,如果您在字符串中有 IP 地址,您可以分别使用^和为该模式添加前缀和后缀。$

于 2013-06-11T07:00:35.220 回答