所以这是我制作的正则表达式:
^(([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地址的正则表达式,而是要找出为什么这个看似正确的不是。
答案 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
,或者在使用这样的替换时首先限制更多)