前言
在 Web 开发中,验证用户输入的 IP 地址是否合法是一个常见需求
面试中也会问到
通常,我们会使用正则表达式来完成这个任务,因为它简洁高效。然而,正则表达式对于初学者来说可能有些晦涩难懂。本文将介绍一种不使用正则表达式的方法来验证 IP 地址的合法性,并深入探讨其背后的原理
IP 地址的格式
一个合法的 IPv4 地址由四个用点号分隔的数字组成,每个数字的取值范围是 0 到 255。例如,“192.168.1.1” 就是一个合法的 IP 地址
验证思路
我们可以将 IP 地址的验证过程分解为以下几个步骤:
-
分割字符串:将 IP 地址字符串按照点号分割成四个部分
-
检查数量:确保分割后的数组长度为 4
-
验证每个部分:
-
检查每个部分是否为有效的数字字符串
-
将字符串转换为数字,并检查其是否在 0 到 255 之间
-
代码实现
function isValidIP(ip) {
// 1. 分割字符串
const parts = ip.split('.');
// 2. 检查数量
if (parts.length !== 4) {
return false;
}
// 3. 验证每个部分
for (let part of parts) {
// 检查是否为有效的数字字符串
if (!/^\d+$/.test(part)) {
return false;
}
// 转换为数字并检查范围
const num = parseInt(part, 10);
if (num < 0 || num > 255) {
return false;
}
// 检查前导零
if (part.length > 1 && part[0] === '0') {
return false;
}
}
return true;
}
// 测试用例
console.log(isValidIP("192.168.1.1")); // true
console.log(isValidIP("256.168.1.1")); // false
console.log(isValidIP("192.168.1")); // false
console.log(isValidIP("192.168.1.01")); // false
代码思路
分割字符串:使用 split(‘.’) 方法将 IP 地址字符串按照点号分割成数组
检查数量:如果分割后的数组长度不等于 4,说明 IP 地址格式不正确,直接返回 false
验证每个部分:
-
使用正则表达式 /^\d+$/ 检查每个部分是否由纯数字组成
-
将字符串转换为整数,并检查其是否在 0 到 255 之间
-
检查是否有前导零(例如 “01” 是不合法的)
总结
通过这种不使用正则表达式的方法,我们可以更直观地理解 IP 地址的验证过程
虽然正则表达式在处理字符串匹配时非常强大,但在某些情况下,使用更基础的字符串操作和逻辑判断也能达到同样的效果,并且更容易理解和维护
我们也需要理解,如何不依赖正则,达到我们需要的目的