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

Why does this regexp for IPv4 doesn't work?

这是我做的雷吉克斯:^(([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地址的regex,而是为了找出这个看起来正确的regex为什么不正确。


文字.只是捕获组"铁路图"200-255部分的一部分。

以下是不同格式的EDOCX1[1]以帮助您找出原因:

1
2
3
4
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。

您可以通过添加捕获组来修复regex,但最终我建议您不要重新设计控制盘并使用a)预先存在的regex解决方案或b)通过拆分点来解析IPv4地址。后一种方法更容易阅读和理解。


要修复您的问题,只需在前三组中的每一组后面加上"十进制"即可:

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

(*请注意,我颠倒了2xx与1xx测试的顺序,在使用这种交替时,我更喜欢SPECIAL|...|NORMAL,或者更严格地说,首先是这样)

行动起来看看