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为什么不正确。
- 你能举一个不起作用的例子吗?
- @NDN添加了一个示例。
- IP地址验证的正则表达式可能重复
- 取出起动用的^和$起下线锚…
- @塞巴斯蒂安普罗斯克,我不是要一个雷杰克斯的IP,我是问为什么这一个不会工作。
- @swaver2112-这些是必需的,否则您可以匹配999127.0.0.1012345,因为没有应用开始/结束锚定。
- @Andrewvershinin是因为你安排分组和交替的方式是错误的。
- 医生的回答是括号弄乱了。
文字.只是捕获组"铁路图"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地址。后一种方法更容易阅读和理解。
- 那么,我如何使它正确呢?
- 没有200-255段,是200-249段和50-55段。
- @塞巴斯蒂安普罗斯克-噢,那也需要修理。我会在中编辑它。
- @塞巴斯蒂安普罗斯克,我已经纠正了这个表达。我已将OR子句括在一个组中,但它不能使表达式正确匹配。
- @AndrewVershinin-您需要添加一个组来修复200-255问题,还需要添加一个组来修复DOT问题。您需要在出现的两个地方修复200-255问题。
- @拉玛先生,谢谢。在点使其工作之前封闭部件。如问题所述,我可以使用谷歌。我只是想知道为什么这个解决方案是不正确的。
要修复您的问题,只需在前三组中的每一组后面加上"十进制"即可:
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,或者更严格地说,首先是这样)
行动起来看看