当前位置: 首页 > news >正文

【前端面试】如何不通过正则:验证IP地址合法性

前言

在 Web 开发中,验证用户输入的 IP 地址是否合法是一个常见需求

面试中也会问到

通常,我们会使用正则表达式来完成这个任务,因为它简洁高效。然而,正则表达式对于初学者来说可能有些晦涩难懂。本文将介绍一种不使用正则表达式的方法来验证 IP 地址的合法性,并深入探讨其背后的原理

IP 地址的格式

一个合法的 IPv4 地址由四个用点号分隔的数字组成,每个数字的取值范围是 0 到 255。例如,“192.168.1.1” 就是一个合法的 IP 地址

验证思路

我们可以将 IP 地址的验证过程分解为以下几个步骤:

  1. 分割字符串:将 IP 地址字符串按照点号分割成四个部分

  2. 检查数量:确保分割后的数组长度为 4

  3. 验证每个部分:

    • 检查每个部分是否为有效的数字字符串

    • 将字符串转换为数字,并检查其是否在 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 地址的验证过程

虽然正则表达式在处理字符串匹配时非常强大,但在某些情况下,使用更基础的字符串操作和逻辑判断也能达到同样的效果,并且更容易理解和维护

我们也需要理解,如何不依赖正则,达到我们需要的目的

相关文章:

  • PartitionFinder2 安装与使用-bioinfomatics tools 051
  • 从源到目标:深度学习中的迁移学习与领域自适应实践
  • 谈谈单例模式中通过Htools包的SpringUtil.getBean获取Bean的好处
  • 探索DEHP与睾酮素的隐秘关联
  • 【免费压测靶场开放】性能测试练习靶场,GET/POST双模式支持
  • SpringMVC学习(初识与复习Web程序的工作流程)(1)
  • 系统架构设计师—计算机基础篇—存储管理
  • Vim 常用快捷键大全:跳转、编辑、查找替换全解析
  • 【前端知识】Vue2.x与3.x之间的区别以及升级过程需要关注的地方
  • ​Java 加密技术全面解析:SM2、SM4、MD5 及常用加密方法​
  • Python Cookbook-2.29 带版本号的文件名
  • Java获取本机Mac地址
  • C++string类
  • Pandas使用教程 - Pandas 与 Web API 交互
  • 从零开始的kafka学习 (一)| 概念,Java API
  • 【QT线程】子线程阻塞主线程的一次网络api请求案例
  • 机试准备第六天
  • [MySQL] MySQL复合查询(多表查询、子查询)
  • 各种传参形式
  • C++/C 编程宝典:掌握指针数组与数组指针的关键区别
  • 可视化课题组网站建设教程/网页模板怎么用
  • 海林建设局网站/杭州优化seo公司
  • 为什么网站用静态页面/品牌战略
  • 电子商务网站建设软件/app推广拉新平台
  • 东莞网站建设渠道/win7系统优化大师
  • 怎么做类似豆瓣的网站/优化seo网站