C语言pcre库的使用及验证IP地址的合法性

2023-11-19

PCRE是一个用C语言编写的正则表达式函数库,它十分易用,同时功能也很强大,性能超过了POSIX正则表达式库和一些经典的正则表达式库,在使用PCRE库时,首先肯定是需要安装pcre的,不过一般的系统都会有自带的PCRE库。不过如果想使用最新版本的话,也可以自已下载一个安装包。或者去官网上下载http://www.pcre.org/

PCRE的常用函数简介

这里只介绍了两个常用的接口函数,另外的可通过PCRE源码文档进行了解。使用PCRE主要是使用下面介绍的这两个函数。

pcre_compile

pcre *pcre_compile(const char *pattern, int options, const char **errptr, int *erroffset, const unsigned char *tableptr)

功能:将一个正则表达式编译成一个内部表示,在匹配多个字符串时,可以加速匹配。其同pcre_compile2功能一样只是缺少一个参数errorcodeptr。

参数说明

pattern 正则表达式
options 为0,或者其他参数选项
errptr 出错消息
erroffset 出错位置
tableptr 指向一个字符数组的指针,可以设置为空NULL。

pcre_exec

int pcre_exec(const pcre *code, const pcre_extra *extra, const char *subject, int length, int startoffset, int options, int *ovector, int ovecsize)

功能:使用编译好的模式进行匹配,采用与Perl相似的算法,返回匹配串的偏移位置。

参数说明

code 编译好的模式
extra 指向一个pcre_extra结构体,可以为NULL
subject 需要匹配的字符串
length 匹配的字符串长度(Byte)
startoffset 匹配的开始位置
options 选项位
ovector 指向一个结果的整型数组
ovecsize 数组大小。

PCRE在C语言中实现正则表达式的解析

上述讲了上面两个PCRE函数的介绍,目的还是为了能够运用上,所以这里就先讲解下使用PCRE的过程。主要过程分三步走第一步编译正则表达式;第二匹配正则表达式;第三步释放正则表达式。

1.编译正则表达式

为了提高效率,在将一个字符串与正则表达式进行比较之前,首先要用pcre_compile() /pcre_compile2() 函数对它时行编译,转化成PCRE引擎能够识别的结构(struct real_pcre)。

  1. 匹配正则表达式

一旦用函数pcre_compile() /pcre_compile2()成功地编译了正则表达式,接下来就可以调用pcre_exec()函数完成模式匹配。根据正则表达式到指定的字符串中进行查找和匹配,并输出匹配的结果。

  1. 释放正则表达式

无论什么时候,当不再需要已经编译过的正则表达式时,都应该调用函数free()将其释放,以免产生内在泄漏。

常用正则表达式

校验数字的表达式

数字:^[0-9]*$
n位的数字:^\d{n}$
至少n位的数字:^\d{n,}$
m-n位的数字:^\d{m,n}$
零和非零开头的数字:^(0|[1-9][0-9]*)$
非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(\.[0-9]{1,2})?$
带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})$
正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
有两位小数的正实数:^[0-9]+(\.[0-9]{2})?$
有1~3位小数的正实数:^[0-9]+(\.[0-9]{1,3})?$
非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
非负整数:^\d+$ 或 ^[1-9]\d*|0$
非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

校验字符的表达式

汉字:^[\u4e00-\u9fa5]{0,}$
英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
长度为3-20的所有字符:^.{3,20}$
由26个英文字母组成的字符串:^[A-Za-z]+$
由26个大写英文字母组成的字符串:^[A-Z]+$
由26个小写英文字母组成的字符串:^[a-z]+$
由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+
禁止输入含有~的字符:[^~\x22]+

校验IPV4的地址合法性

下面使用PCRE库函数的实现一个小例子,其功能是检验IPV4的地址合法性。

pcre_test.c

#include <stdio.h>
#include <stdlib.h>
#include <pcre.h>
#include <string.h>

#define OVERCOUNT 128
#define IP_NUM 20
/*
功能:校验IPV4的地址合法性
输出参数:地址合法则返回0,否则返回-1
*/

int check_if_ipv4_valid(char *ipv4)
{

    //利用正则表达式去判断IP地址是否合法

    pcre *re = NULL;
    int erroffset = 0;
    const char *errptr=NULL;
    int overtor[OVERCOUNT] = {0};
    // 将要被编译的字符串形式的正则表达
    char ipv4_regular_expression[] = "^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$";

    if ((re = pcre_compile(ipv4_regular_expression,PCRE_CASELESS,&errptr,&erroffset,NULL)) ==NULL)
    {
        return -1;
    }

    if (pcre_exec(re,NULL,ipv4,strlen(ipv4),0,0,overtor,OVERCOUNT) > 0)
    {
        return 0;
    }

	pcre_free(re);                     // 编译正则表达式re 释放内存    
    return -1;
}


int main(int argc, char **argv)
{

    char IP[IP_NUM];

    printf("Input IPADDR\n");

    fgets(IP,sizeof(IP),stdin);
    if (0 == check_if_ipv4_valid(IP))
    {  
         printf("IP legal\n");
    }
    else
    {
        printf("IP illegal\n");
    }

}

编译运行

在这里插入图片描述
从上面我们可以看到PCRE库的使用相对简单,首先执行pcre_compile()函数将模式编译为pcre数据结构,接下来就可以调用pcre_exec()函数完成模式匹配。根据正则表达式到指定的字符串中进行查找和匹配,并输出匹配的结果。还有要记得编译的时候要加上 -lpcre

总结

学习正则表达式的最好方法是从例子开始,理解例子之后再自己对例子进行修改,实验。还有就是,如果你不觉得正则表达式很难读写的话,不妨找一种工具对正则表达式进行测试是否正确,这是很有必要的。例如:正则测试器 Regex Tester

在这里插入图片描述
欢迎关注公众号【程序猿编码】,添加本人微信号(17865354792),回复:领取学习资料。或者回复:进入技术交流群。网盘资料有如下:

在这里插入图片描述

参考:《菜鸟教程-正则表达式》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言pcre库的使用及验证IP地址的合法性 的相关文章

  • 【力扣经典题目】链表的回文结构,赶快收藏起来

    题目描述 对于一个链表 请设计一个时间复杂度为O n 额外空间复杂度为O 1 的算法 判断其是否为回文结构 给定一个链表的头指针A 请返回一个bool值 代表其是否为回文结构 保证链表长度小于等于900 测试样例 1 gt 2 gt 2 g
  • Windows10 2004无线网卡电源管理消失 电源计划只有平衡

    问题 升级到了Windows10 2004 发现每次睡眠后QQ和微信消息都收不到了 去网卡的属性界面却找不到电源管理面板 并且电源计划中也只能创建平衡的电源计划 在网上找了很多解决办法 最多的是关于一个改注册表中的更改注册表HKEY LOC

随机推荐

  • 9 变量进阶

    变量进阶 变量的引用 可变和不可变类型 局部变量和全局变量 1 变量的引用 变量和数据都是保存在内存中的 在 python 中 函数 的参数传递以及返回值都是靠引用传递的 引用的概念 在 python 中 变量和数据是分开存储的 数据保存在
  • 应用层、传输层、网络层、数据链路层

    应用层 包括 应用服务 FTP FileTransfer Protocol 文件传输协议 和DNS Domain NameSystem 域名系统 发送HTTP请求 DNS域名解析系统 提供通过域名 www baidu com 查找IP地址
  • 劳务派遣员工转正制度是什么

    一 劳务派遣员工转正制度是什么 要根据不同的单位来看 因为具体的制度还是要看用工单位的相关规定 比如大部分银行每年都会有一定的转正名额 公务员和事业单位的转正机会则较少 想要成为正式员工还是要参加招聘考试 银行招聘的时候会以劳务派遣的方式招
  • DDK&WDM学习 - HelloWDM,WDM驱动加载,INF文件

    转自 http www itstudy net html 200911 30 20091130234443 htm 第十五章 驱动程序的安装 方便的 自动的和容易的安装一个设备驱动程序对于用户来说是一个重要的步骤 对于提供给用户容易的设备管
  • 解决存储vuex数据,页面刷新后vuex数据被清空了的问题

    1 vuex刷新后数据会被清除 2 可以监听用户是否手动刷新页面 刷新之前先把vuex的数据存储在localStorage里面 页面加载时读取localStorage里的状态信息给vuex赋值 赋值后再清空localStorage 打开ap
  • 一篇文章看懂自动引用计数和循环引用到底是怎么回事

    ARC Swift中的ARC Automatic Reference Counting 自动引用计数 是一种内存管理机制 用于跟踪和管理应用程序中的对象引用计数 确保内存中的对象只在需要的时候存在 当对象的引用计数为0时就会被系统析构掉 A
  • 【双流(1)|原理】flink 双流join原理(1)Interval Join:state过大? 回撤现象出现时,sink如何处理,还有如何优化回撤?数据出现shuffle时join是如何处理的?

    先思考几个问题 双流join的基本原理是什么 双流join的分类有哪些 具体的实现是什么 双流join产生的问题 回撤的情况以及优化的可能性 多流join数据倾斜与性能优化思路 多流join的可能性 文章目录 一 流的join和表的join
  • 校验是否是金额或者小数或者数字,是否是数字

    校验是否是金额或者小数或者数字 是否是数字 param val return bool static function isValidMoney val pattern d d 1 5 if preg match pattern val r
  • c++工程模式+配置文件+动态调用类

    前言 主函数 SimpleFactoryRefactor cpp include
  • JVM和Android虚拟机知识点总结

    文章目录 1 JVM Dalvik Art虚拟机的区别 1 1 JVM和Dalvik的区别 1 2 Dalvik和Art的区别 2 Class文件和dex文件的区别 3 基于寄存器的Android虚拟机和基于栈的JVM 3 1 栈和栈帧 3
  • 算法基础/递归回溯

    1 17 电话号码的字母组合 题目描述 示例 示例 1 输入 digits 23 输出 ad ae af bd be bf cd ce cf 示例 2 输入 digits 输出 示例 3 输入 digits 2 输出 a b c 解答描述
  • JSON.stringify()

    JSON stringify 将一个JavaScript值 对象或者数组 转换为一个 JSON字符串 如果指定了replacer是一个函数 则可以选择性的替换值 或者如果指定了replacer是一个数组 可选择性的仅包含数组指定的属性 语法
  • 粤嵌GEC6818开发板-入门感慨篇(续一)

    触摸屏的事件 include
  • Sql几种删除的区别

    Drop drop可用于删除数据库 drop database 数据库名称 删除数据表 use 数据库名称 drop table 数据表1名称 数据表2名 或删除数据表字段 use 数据库名称 alter table 数据表名称 drop
  • mqttxieyi

    Mqtt概述 Mqtt开发最初是用于卫星通讯监控输油管道的项目 一种用于嵌入式设备的通讯协议 这种通讯协议必须满足以下条件 易于实现 数据传输的服务质量可控 占用带宽小 传输数据内容不可预知 设备连接状态可知 MQTT 从诞生之初就是专为低
  • 使用PyCharm进行Python远程调试

    背景描述 在机房中 服务器通过ADB与多台Android设备相连接 并通过Python应用程序 QMSInterceptor 对Android设备进行任务调度 在开发环境中对QMSInterceptor调试完毕后 上传至服务器 发现程序运行
  • Linux基础介绍

    Linux的创始人Linus Torvalds Linux的官方标准发音为 lin ks Linux和Unix是非常像的 Linux就是根据Unix演变过来的 Linux是免费的 其实只是说Linux的内核免费 在Linux内核的基础上产生
  • JAVA协同过滤推荐算法

    1 什么是协同过滤 在推荐系统众多方法中 基于用户的协同过滤推荐算法是最早诞生的 原理也较为简单 该算法1992年提出并用于邮件过滤系统 两年后1994年被 GroupLens 用于新闻过滤 一直到2000年 该算法都是推荐系统领域最著名的
  • WPF TextBox 加默认提示文字

  • C语言pcre库的使用及验证IP地址的合法性

    PCRE是一个用C语言编写的正则表达式函数库 它十分易用 同时功能也很强大 性能超过了POSIX正则表达式库和一些经典的正则表达式库 在使用PCRE库时 首先肯定是需要安装pcre的 不过一般的系统都会有自带的PCRE库 不过如果想使用最新