今天面试xx公司,面试官要我写正则验证ip地址的合法性,我写的是:
((25[0-5]|2[0-4]\d|1?\d?\d).){3}(25[0-5]|2[0-4]\d|1?\d?\d)
即验证范围是 0.0.0.0-255.255.255.255
然后面试官问我写的这个当出现 010.020.023.01这种情况时我的正则也可以匹配出来,但是010.020.023.01并不是合法的ip,可是我认为ip地址这个是合法的,ip以点分十进制表示,这个ip应该等同于10.20.23.1
于是我用电脑进行测试,ping了一下192.162.010.023这个ip地址,可是显示的却是192.168.8.19这个ip
说明此处将010.023变成了八进制进行解析,即010->8,023->19!!!
由于八进制中,数字为0-7,所以当出现8、9时即错误
当转化成十进制数时,不超过0-255即为合法ip
(0378)8=(256)10,超过255所以请求不到
然后我又测了一下,当我将梳子换成16进制时
在linux操作系统和windows操作系统环境下均为上述显示
经过研究由于在c语言中0开头的数字按8进制处理;0x就会翻译成16进制,windows和linux内核都是c,所以会将其翻译成相应的进制
综上,我认为,我所写的正则表达式是对的,即在三位数字的情况下,0xx(x表示数字)格式的ip写法也应该是正确的
以上内容纯属个人见解,欢迎大家与我进行交流讨论,指出错误