我正在尝试构建一个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})
有没有更优雅的方法来处理这样的场景,其中正则表达式可以有较小的正则表达式片段,可以在整个正则表达式中再次引用?
答案 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
<强>更新强>
答案 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}))
修改强>
我建议使用正则表达式,但我绝不会建议您使用正则表达式来执行此操作。您应该使用SPLIT
函数并迭代索引并将其与0到255之间的范围进行比较。请参阅我在顶部的评论。
关于Regex,如果您在字符串中有IP地址,则可以分别使用^
和$
作为前缀和后缀。