为什么IPv4的这个正则表达式不起作用?

时间:2016-12-06 17:42:50

标签: regex pcre

所以这是我制作的正则表达式: ^(([01]?\d{1,2})|(2(([0-4]\d)|(5[0-5])))\.){3}(([01]?\d{1,2})|(2(([0-4]\d)|(5[0-5]))))$

我已经使用了几个网站来分解它,它似乎应该可以工作,但事实并非如此。期望的结果是匹配任何IPv4 - 由点分隔的0到255之间的四个数字。

例如,1.1.1.1不会给你一个匹配。 这个问题的目的不是要找出IPv4地址的正则表达式,而是要找出为什么这个看似正确的不是。

2 个答案:

答案 0 :(得分:3)

文字.只是捕获组200-255部分的一部分:railroad diagram

此处的(([01]?\d{1,2})|(2([0-4]\d)|(5[0-5]))\.)格式不同,可帮助您找出原因:

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

您将0-199 200-255与点匹配。该点以匹配200-255为条件。

另外,正如@SebastianProske所指出的那样,2([0-4]\d)|(5[0-5])匹配200-249 50-55,而不是200-255。

您可以通过添加捕获组来修复正则表达式,但最终我建议不要重新发明轮子并使用A)预先存在的正则表达式解决方案或B)通过分割点来解析IPv4地址。后一种方法更容易阅读和理解。

答案 1 :(得分:0)

修复你的问题,只需考虑前三个组中的“十进制”:

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

(*请注意,我改变了 2xx vs 1xx 测试的顺序 - 更喜欢SPECIAL|...|NORMAL,或者在使用这样的替换时首先限制更多)

see it in action