重复子序列的有效正则表达式

时间:2013-06-11 04:52:12

标签: regex

我正在尝试构建一个regexp,其中预期子序列将在整个匹配中的不同场景中发生。类似的例子是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})

有没有更优雅的方法来处理这样的场景,其中正则表达式可以有较小的正则表达式片段,可以在整个正则表达式中再次引用?

3 个答案:

答案 0 :(得分: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?

答案 1 :(得分: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

<强>更新

Live results here

答案 2 :(得分: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}))

Live example

修改

我建议使用正则表达式,但我绝不会建议您使用正则表达式来执行此操作。您应该使用SPLIT函数并迭代索引并将其与0到255之间的范围进行比较。请参阅我在顶部的评论。

关于Regex,如果您在字符串中有IP地址,则可以分别使用^$作为前缀和后缀。