用正则表达式检查是IP否为内网地址

news/2024/11/13 17:08:11/

正则表达式检查是ip否为内网地址

function isIntranet($ip)
{/* IPV4内网地址A 类10.0.0.0~10.255.255.255B 类172.16.0.0~172.31.255.255C 类192.168.0.0~192.168.255.255*/// 检查是否为 IPv4 内网地址if (preg_match('/^10\./', $ip)) return true;if (preg_match('/^172\.(1[6-9]|2[0-9]|3[0-1])\./', $ip)) return true;if (preg_match('/^192\.168\./', $ip)) return true;/* IPV6内网地址ULA地址: fc00::/7 (fc00:: - fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff)链路本地地址: fe80::/10 (fe80:: - febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff)*/// 检查是否为 IPv6 内网地址if (preg_match('/^f[c-d][0-9a-f]{2}:/i', $ip)) return true;  // 匹配 fc00::/7 (包括 fc00:: 和 fdff:: 范围)if (preg_match('/^fe[89ab][0-9a-f]:/i', $ip)) return true;   // 匹配 fe80::/10 (包括 fe80:: 到 febf:: 范围)return false;
}
  • Java
java">import java.util.regex.Pattern;public class IPUtils {public static boolean isIntranet(String ip) {// IPV4 内网地址正则表达式String ipv4Pattern10 = "^10\\.";String ipv4Pattern172 = "^172\\.(1[6-9]|2[0-9]|3[0-1])\\.";String ipv4Pattern192 = "^192\\.168\\.";// IPV6 内网地址正则表达式String ipv6PatternFC = "^f[c-d][0-9a-f]{2}:";String ipv6PatternFE = "^fe[89ab][0-9a-f]:";// 匹配 IPv4 内网地址if (Pattern.matches(ipv4Pattern10, ip)) return true;if (Pattern.matches(ipv4Pattern172, ip)) return true;if (Pattern.matches(ipv4Pattern192, ip)) return true;// 匹配 IPv6 内网地址if (Pattern.matches(ipv6PatternFC, ip)) return true;if (Pattern.matches(ipv6PatternFE, ip)) return true;return false;}public static void main(String[] args) {System.out.println(isIntranet("10.0.0.1"));       // trueSystem.out.println(isIntranet("fc00::1"));        // trueSystem.out.println(isIntranet("172.16.0.1"));     // trueSystem.out.println(isIntranet("192.168.0.1"));    // trueSystem.out.println(isIntranet("fe80::1"));        // trueSystem.out.println(isIntranet("8.8.8.8"));        // false}
}
  • Golang
package mainimport ("fmt""regexp"
)func isIntranet(ip string) bool {// 定义 IPv4 内网地址的正则表达式ipv4Pattern10 := `^10\.`ipv4Pattern172 := `^172\.(1[6-9]|2[0-9]|3[0-1])\.`ipv4Pattern192 := `^192\.168\.`// 定义 IPv6 内网地址的正则表达式ipv6PatternFC := `^f[c-d][0-9a-f]{2}:`ipv6PatternFE := `^fe[89ab][0-9a-f]:`// 匹配 IPv4 内网地址if matched, _ := regexp.MatchString(ipv4Pattern10, ip); matched {return true}if matched, _ := regexp.MatchString(ipv4Pattern172, ip); matched {return true}if matched, _ := regexp.MatchString(ipv4Pattern192, ip); matched {return true}// 匹配 IPv6 内网地址if matched, _ := regexp.MatchString(ipv6PatternFC, ip); matched {return true}if matched, _ := regexp.MatchString(ipv6PatternFE, ip); matched {return true}return false
}func main() {fmt.Println(isIntranet("10.0.0.1"))      // truefmt.Println(isIntranet("fc00::1"))       // truefmt.Println(isIntranet("172.16.0.1"))    // truefmt.Println(isIntranet("192.168.0.1"))   // truefmt.Println(isIntranet("fe80::1"))       // truefmt.Println(isIntranet("8.8.8.8"))       // false
}
#include <stdio.h>
#include <stdbool.h>
#include <regex.h>bool isIntranet(const char *ip) {// 定义正则表达式的模式和个数const char *patterns[] = {"^10\\.",                     // IPv4 10.x.x.x"^172\\.(1[6-9]|2[0-9]|3[0-1])\\.",  // IPv4 172.16.x.x - 172.31.x.x"^192\\.168\\.",              // IPv4 192.168.x.x"^f[c-d][0-9a-f]{2}:",        // IPv6 fc00::/7"^fe[89ab][0-9a-f]:"          // IPv6 fe80::/10};const int pattern_count = sizeof(patterns) / sizeof(patterns[0]);regex_t regex[pattern_count];bool result = false;// 编译所有正则表达式for (int i = 0; i < pattern_count; i++) {if (regcomp(&regex[i], patterns[i], REG_EXTENDED | REG_ICASE) != 0) {// 编译失败时释放已分配的正则表达式资源for (int j = 0; j < i; j++) regfree(&regex[j]);return false;}}// 匹配所有模式for (int i = 0; i < pattern_count; i++) {if (regexec(&regex[i], ip, 0, NULL, 0) == 0) {result = true;break;}}// 释放正则表达式资源for (int i = 0; i < pattern_count; i++) {regfree(&regex[i]);}return result;
}int main() {printf("%d\n", isIntranet("10.0.0.1"));      // 1 (true)printf("%d\n", isIntranet("fc00::1"));       // 1 (true)printf("%d\n", isIntranet("172.16.0.1"));    // 1 (true)printf("%d\n", isIntranet("192.168.0.1"));   // 1 (true)printf("%d\n", isIntranet("fe80::1"));       // 1 (true)printf("%d\n", isIntranet("8.8.8.8"));       // 0 (false)return 0;
}
#include <iostream>
#include <regex>
#include <string>bool isIntranet(const std::string& ip) {// 定义 IPv4 内网地址的正则表达式std::regex ipv4Pattern10("^10\\.");std::regex ipv4Pattern172("^172\\.(1[6-9]|2[0-9]|3[0-1])\\.");std::regex ipv4Pattern192("^192\\.168\\.");// 定义 IPv6 内网地址的正则表达式std::regex ipv6PatternFC("^f[c-d][0-9a-f]{2}:", std::regex::icase);std::regex ipv6PatternFE("^fe[89ab][0-9a-f]:", std::regex::icase);// 匹配 IPv4 内网地址if (std::regex_search(ip, ipv4Pattern10)) return true;if (std::regex_search(ip, ipv4Pattern172)) return true;if (std::regex_search(ip, ipv4Pattern192)) return true;// 匹配 IPv6 内网地址if (std::regex_search(ip, ipv6PatternFC)) return true;if (std::regex_search(ip, ipv6PatternFE)) return true;return false;
}int main() {std::cout << isIntranet("10.0.0.1") << std::endl;      // truestd::cout << isIntranet("fc00::1") << std::endl;       // truestd::cout << isIntranet("172.16.0.1") << std::endl;    // truestd::cout << isIntranet("192.168.0.1") << std::endl;   // truestd::cout << isIntranet("fe80::1") << std::endl;       // truestd::cout << isIntranet("8.8.8.8") << std::endl;       // falsereturn 0;
}

http://www.ppmy.cn/news/1546724.html

相关文章

Qt 获取当前系统中连接的所有USB设备的信息 lsusb版

Qt 获取当前系统中连接的所有USB设备的信息 lsusb版 flyfish 环境 Ubuntu22.04 Qt 6.2.4 实现的功能 枚举USB设备&#xff1a;使用lsusb命令获取当前系统中连接的所有USB设备的信息。 解析设备信息&#xff1a;将lsusb命令的输出按行分割&#xff0c;并提取每行中的总线号、…

CentOS 安装 Python 3.11.9完整流程

在 CentOS 上安装 Python 3.11.9 并替换系统中的默认 Python 版本&#xff0c;可以按照以下步骤来进行。请注意&#xff0c;替换默认 Python 版本可能会影响系统的其他工具和依赖&#xff0c;因此请谨慎操作。 步骤 1&#xff1a;安装依赖 首先&#xff0c;确保系统安装了编译…

计算机毕业设计Python+大模型斗鱼直播可视化 直播预测 直播爬虫 直播数据分析 直播大数据 大数据毕业设计 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Docker:镜像构建 DockerFile

Docker&#xff1a;镜像构建 DockerFile 镜像构建docker build DockerfileFROMCOPYENVWORKDIRADDRUNCMDENTRYPOINTUSERARGVOLUME 镜像构建 在Docker官方提供的镜像中&#xff0c;大部分都是基础镜像&#xff0c;他们只提供某个简单的功能&#xff0c;如果想要一个功能更加丰富…

大型系统从一种语言迁移重构到另一种语言的核心思路是什么

从大的方面拆分为两个层次的问题。 要不要做 要不要做本质上是要分析做的利弊&#xff0c;适合用SWOT分析法。所谓SWOT分析&#xff0c;即基于内外部竞争环境和竞争条件下的态势分析&#xff0c;就是将与研究对象密切相关的各种主要内部优势、劣势和外部的机会和威胁等&#xf…

LeetCode【0019】删除链表的倒数第N个结点

本文目录 1 中文题目2 求解方法&#xff1a;虚拟头节点和快慢指针2.1 方法思路2.2 Python代码2.3 复杂度分析 3 题目总结 1 中文题目 给定一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例&#xff1a; 链表如上&#xff1a; 输入&a…

Oracle OCP认证考试考点详解082系列16

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 76. 第76题&#xff1a; 题目 解析及答案&#xff1a; 以下哪三项活动会被记录在数据库的警报日志中&#xff1f; A. 块损坏错误 数据库…

Conpair: 配对样本一致性concordance与污染contamination分析

Conpair 于2016年被发表在《Bioinformatics》上&#xff0c;用于分析配对样本&#xff08;如某个病人的肿瘤样本和正常样本&#xff09;WGS或WES测序的一致性和交叉个体污染。 特点 支持的基因组 因为需要指定markers选项&#xff0c;作者只提供了GRCh37, GRCh38, GRCm38的文…