嵌入式Linux系统编程 — 4.7 regcomp、regexec、regfree正则表达式函数

news2024/10/7 0:56:32

目录

1 为什么需要正则表达式

2 正则表达式简介

3 正则表达式规则

4 regcomp、regexec、regfree函数

4.1 函数介绍

4.2 URL格式案例


1 为什么需要正则表达式

在许多的应用程序当中, 有这样的应用场景: 给定一个字符串,检查该字符串是否符合某种条件或规则、或者从给定的字符串中找出符合某种条件或规则的子字符串, 将匹配到的字符串提取出来。这种需要在很多的应用程序当中是存在的:

  • 例如,很多应用程序都有这种校验功能,譬如检验用户输入的账号或密码是否符合它们定义的规则,如果不符合规则通常会提示用户按照正确的规则输入用户名或密码。
  • 譬如给定一个字符串,在程序当中判断该字符串是否是一个 IP 地址, 对于实现这个功能, 大家可能首先想到的是,使用万能的 for 循环, 当然,笔者首先肯定的是, 使用 for 循环自然是可以解决这个问题, 但是在程序代码处理上会比较麻烦,有兴趣的朋友可以自己试一下。

对于这些需求,其实只需要通过一个正则表达式就可以搞定了, 下一小节开始将向大家介绍正则表达式。

2 正则表达式简介

正则表达式又称为规则表达式(Regular Expression),正则表达式通常被用来检索、替换那些符合某个模式(规则)的字符串,正则表达式描述了一种字符串的匹配模式(pattern),可以用来检查一个给定的字符串中是否含有某种子字符串、将匹配的字符串替换或者从某个字符串中取出符合某个条件的子字符串。

在 Linux 系统下运行命令的时候,使用过?或*通配符来查找硬盘上的文件或者文本中的某个字符串, ?通配符匹配 0 个或 1 个字符,而*通配符匹配 0 个或多个字符,譬如"data?.txt"这样的匹配模式可以将下列文件查找出来:

        data.dat
        data1.dat
        data2.dat
        datax.dat
        dataN.dat

许多程序设计语言都支持正则表达式。譬如,在 Perl 中就内建了一个功能强大的正则表达式引擎、Python提供了内置模块 re 用于处理正则表达式, 正则表达式这个概念最初是由 Unix 中的工具软件(例如 sed 和grep)普及开的。同样,在 C 语言函数库中也提供了用于处理正则表达式的接口供程序员使用。

3 正则表达式规则

正则表达式的匹配语法和规则是用于指定搜索模式的字符串,它们由普通字符(如字母和数字)和特殊字符组成。特殊字符有着不同的用途,例如匹配模式、重复次数、字符类等。下面是一些常用的正则表达式元素及其匹配规则:

普通字符:直接匹配自身,如 a 匹配字符 'a'。

特殊字符

  • .:匹配任意单个字符(除了换行符)。
  • ^:匹配输入字符串的开始位置。
  • $:匹配输入字符串的结束位置。
  • |:逻辑或操作符,匹配两个模式中的一个。
  • []:字符集,匹配括号内的任意字符,如 [abc] 匹配 'a'、'b' 或 'c'。
  • ():分组,将多个规则组合成一个单元,也可以用于捕获匹配的子字符串。

量词:指定元素出现的次数。

  • *:匹配前面的子模式零次或多次。
  • +:匹配前面的子模式一次或多次。
  • ?:匹配前面的子模式零次或一次。
  • {n}:匹配确定的 n 次数。
  • {n,}:至少匹配 n 次。
  • {n,m}:最少匹配 n 次且最多 m 次。

转义特殊字符:使用 \ 对特殊字符进行转义,使其作为普通字符匹配,如 \. 匹配字符 '.'。

字符类

  • \d:匹配任何数字,等同于 [0-9]
  • \w:匹配任何字母数字字符,包括下划线,等同于 [A-Za-z0-9_]
  • \s:匹配任何空白字符(空格、制表符、换行符等)。

否定字符集:使用 ^ 放在 [ 后面来表示否定字符集,如 [^abc] 匹配除了 'a'、'b'、'c' 之外的任何字符。

懒惰(非贪婪)匹配:在量词后面加上 ? 使其变为懒惰模式,尽可能少地匹配字符,如 .*? 尽可能少地匹配任何字符。

断言

  • \b:匹配单词边界。
  • (?=...):正向先行断言,匹配...前面的位置。
  • (?!...):负向先行断言,匹配除了...之外的前面的位置。

回溯引用:使用 \1\2、... 来引用之前通过分组捕获的匹配。

模式修饰符

  • i:不区分大小写。
  • g:全局搜索。
  • m:多行匹配。

4 regcomp、regexec、regfree函数

regcompregexecregfree 是正则表达式库中的三个核心函数,用于编译、匹配、释放正则表达式。

4.1 函数介绍

regcomp() 函数:编译正则表达式字符串,生成一个正则表达式对象。原型:

#include <regex.h>

int regcomp(regex_t *preg, const char *pattern, int cflags);
  • preg:指向 regex_t 结构的指针,用于存储编译后的正则表达式。
  • pattern:要编译的正则表达式字符串。
  • cflags:编译时的选项标志,常用的有 REG_EXTENDED(扩展正则表达式)和 REG_ICASE(不区分大小写的匹配)。

regexec() 函数:使用编译后的正则表达式对象匹配目标字符串。

int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
  • preg:指向编译后的正则表达式的 regex_t 结构。
  • string:要匹配的字符串。
  • nmatch:匹配结果数组的大小,0 表示不存储匹配结果。
  • pmatch:指向 regmatch_t 数组的指针,用于存储每个匹配结果的起始和结束位置。数组的大小至少为 nmatch
  • eflags:执行匹配时的选项标志,如 REG_NOTBOL^ 不匹配字符串的开始)和 REG_NOTEOL$ 不匹配字符串的结束)。

regfree() 函数:释放 regcomp() 函数分配的内存资源。

void regfree(regex_t *preg);
  • preg:指向 regex_t 结构的指针,该结构是之前通过 regcomp() 函数编译得到的。

4.2 URL格式案例

^((ht|f)tps?)://[-A-Za-z0-9_]+(\.[-A-Za-z0-9_]+)+([-A-Za-z0-9_.,@?^=%&:/~+#]*[-A-Za-z0-9_@?^=%&/~+#])?$

上面的正则表达式用于匹配大多数的URL格式。下面是对正则表达式各部分的解释:

  • ^:匹配字符串的开始。
  • ((ht|f)tps?):匹配 "http" 或 "https",问号表示前面的字符 "s" 是可选的。
  • ://:匹配 "://",这是URL协议部分和域名部分的分隔符。
  • [-A-Za-z0-9_]+:匹配域名的第一个部分,允许字母、数字、连字符和下划线,+ 表示一个或多个。
  • (\.[-A-Za-z0-9_]+)+:匹配域名的后续部分,可以有多个,格式为点后跟一个或多个允许的字符。
  • ([-A-Za-z0-9_.,@?^=%&:/~+#]*:匹配URL的路径部分的开始,允许字母、数字、点、逗号和其他一些URL中常见的特殊字符,* 表示零个或多个。
  • [-A-Za-z0-9_@?^=%&/~+#]):正则表达式的最后部分,匹配路径的结束,允许的字符与上面相同,但这里只允许一个字符,因为整个路径部分已经通过前面的 * 匹配了任意长度。
  • ?:使路径部分成为可选。
  • $:匹配字符串的结束。

这个正则表达式可以匹配以下类型的URL:

  • http://example.com
  • https://www.example.com
  • http://example.com/path/to/resource
  • https://example.com?query=string

下面的程序,使用正则表达式库来验证用户输入的URL字符串是否符合特定的格式。

#include <stdio.h>
#include <stdlib.h>
#include <regex.h>
#include <string.h> // 引入字符串处理函数

#define MAX_URL_LENGTH 1024

int main() {
    char url[MAX_URL_LENGTH]; 
    // 修正后的正则表达式,注意转义序列
    const char *pattern = 
        "^((ht|f)tps?)://[-A-Za-z0-9_]+(\\.[-A-Za-z0-9_]+)+([-A-Za-z0-9_.,@?^=%&:/~+#]*[-A-Za-z0-9_@?^=%&/~+#])?$";
    regex_t regex;
    int ret;

    // 请求用户输入URL
    printf("请输入URL: ");
    fgets(url, MAX_URL_LENGTH, stdin); // 使用fgets读取一行输入

    // 去除fgets读取的末尾换行符
    size_t len = strlen(url);
    if(len > 0 && url[len - 1] == '\n') {
        url[len - 1] = '\0';
    }

    // 编译正则表达式
    ret = regcomp(&regex, pattern, REG_EXTENDED);
    if (ret) {
        fprintf(stderr, "Error compiling regex\n");
        exit(1);
    }

    // 执行匹配
    ret = regexec(&regex, url, 0, NULL, 0);
    if (!ret) {
        printf("'%s' 是一个有效的URL。\n", url);
    } else {
        printf("'%s' 不是一个有效的URL。\n", url);
    }

    // 释放正则表达式分配的资源
    regfree(&regex);

    return 0;
}

首先程序提示用户输入URL,使用fgets函数读取用户输入后,程序去除末尾的换行符。接着、编译一个预定义的正则表达式,并用它来检查输入的URL。如果URL匹配正则表达式模式,则认为它是有效的,并打印相应消息;否则,打印无效消息。最后,程序释放与正则表达式相关的资源。程序运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1873787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字信号处理实验三(IIR数字滤波器设计)

IIR数字滤波器设计&#xff08;2学时&#xff09; 要求&#xff1a; 产生一复合信号序列&#xff0c;该序列包含幅度相同的28Hz、50Hz、100Hz、150Hz的单音&#xff08;单频&#xff09;信号&#xff1b;其中&#xff0c;50Hz及其谐波为工频干扰&#xff08;注&#xff1a;采样…

Git与GitLab的企业实战--尚硅谷git课程

Git与GitLab的企业实战 第1章 Git概述 Git是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。 Git易于学习&#xff0c;占地面积小&#xff0c;性能极快。 它具有廉价的本地库&#xff0c;方便的暂存区域和多个工作流分支等特性…

揭秘系统架构:从零开始,探索技术世界的无限可能

文章目录 引言一、系统架构的基本概念二、系统架构的设计原则模块化可扩展性高可用性安全性 三、常见的系统架构模式1. **分层架构&#xff08;Layered Architecture&#xff09;**&#xff1a;2. **微服务架构&#xff08;Microservices Architecture&#xff09;**&#xff1…

微信视频号里面的视频怎么下载,分享4个视频号视频下载方法!可长期使用

如何在微信视频号里下载视频,虽然互联网上微信视频号视频下载方法千千万&#xff0c;奈何总有一些方法不起任何作用. 如何解决这一问题&#xff0c;今天就分享3个可以下载微信视频号的视频方法仅供参考。 1:提取器助手 手机搜索提取器助收/扫码获取视频号下载小助手二维码。该…

G882磁力仪拖鱼位置是如何计算的?

根据参考文献&#xff0c;磁力仪拖鱼位置计算有两种方法&#xff1a; 1、直线法 直线计算法是假设不考虑海流、船摆等动态因素的影响&#xff0c;拖鱼与拖点始终和航向相同&#xff0c;即整个拖拽系统与船舶是刚性连接。 2、曲线法 实际海洋磁力测量中&#xff0c;在海风、海…

6.24.4.2 YOLO- logo:一种基于变压器的YOLO分割模型,用于数字乳房x光片中乳腺肿块的检测和分割

背景与目的:数字化乳房x光片的肿块检测和分割在乳腺癌的早期发现和治疗中起着至关重要的作用。此外&#xff0c;临床经验表明&#xff0c;它们是乳腺病变病理分类的上游任务。深度学习的最新进展使分析更快、更准确。本研究旨在开发一种用于乳房x线摄影的乳腺癌质量检测和分割的…

柯桥在职学历提升|专科本科之自考本科哪些专业不考数学

一、管理类专业 这类专业综合性和理论性比较强&#xff0c;除了涉及到管理学相关的理论知识外&#xff0c;还有相应的专业知识&#xff0c;目前比较典型的专业有&#xff1a;行政管理、人力资源管理、工商管理&#xff08;现代企业管理&#xff09;、工商管理&#xff08;商务管…

【websocket】websocket网课视频记录

仅个人方便回顾。 【WebSocket入门与案例实战-哔哩哔哩】 https://b23.tv/2p1f9t2 课程对应代码仓库: https://gitee.com/duoli-java/websocket-demo.git

SpringBoot防抖方案(防止表单重复提交)

SpringBoot防抖方案&#xff08;防止表单重复提交&#xff09; 1.应用场景&#xff08;什么是防抖&#xff09; 所谓防抖&#xff0c;一是防用户手抖&#xff0c;二是防网络抖动。在Web系统中&#xff0c;表单提交是一个非常常见的功能&#xff0c;如果不加控制&#xff0c;容…

Selenium IDE 的使用指南

Selenium IDE 的使用指南 在自动化测试的领域中&#xff0c;Selenium 是一个广为人知且强大的工具集。而 Selenium IDE 作为其中的一个组件&#xff0c;为测试人员提供了一种便捷且直观的方式来创建和执行自动化测试脚本。 一、Selenium IDE 简介 Selenium IDE 是一个用于录…

GRS认证流程是什么?

GRS认证的认证流程主要包括以下几个步骤&#xff1a; 1. 提交申请 首先&#xff0c;企业需要向GRS认证机构提交认证申请&#xff0c;并提供相关的企业信息和产品信息。这通常包括企业的基本信息、生产工厂信息、产品范围、生产流程等。 2. 合同评审 认证机构会对企业提交的…

基于java语言+springboot技术架构开发的 互联网智能3D导诊系统源码支持微信小程序、APP 医院AI智能导诊系统源码

基于java语言springboot技术架构开发的 互联网智能3D导诊系统源码支持微信小程序、APP 医院AI智能导诊系统源码 一、智慧导诊系统开发原理 导诊系统从原理上大致可分为基于规则模板和基于数据模型两类。 1、基于规则推理的方法通过人工建立症状、疾病和科室之间的对应规则实现…

5G VONR

转载&#xff1a;VoNR呼叫流程介绍 (baidu.com) 使用5G RAN、5G Core和IMS的语音服务被称为新无线电VoNR上的语音&#xff0c;5G提供语音/视频通话等服务。 NR网络架构上的语音 NR语音网络体系结构由5G RAN、5G Core和IMS网络组成。下面显示了一个体系结构。&#xff08;仅包…

snowflake 不再是个数据仓库公司了

标题先上结论&#xff0c;为啥这么认为&#xff0c;且听接下来道来。 snowflake 非常成功&#xff0c;开创了云数仓先河&#xff0c;至今在数仓架构上也是相对比较先进的&#xff0c;国内一堆模仿的公司&#xff0c;传统上我们会认为 snowflake 肯定是一家数据仓库公司。不过最…

小模型家族又新增成员Gemma2

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba&#xff0c;xLSTM,KAN&#xff09;则提供了大模…

3.Android逆向协议-APP反反编译及回编译

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;微尘网校 上一个内容&#xff1a;2.Android逆向协议-了解常用的逆向工具 在实际应用场景中会阅读smail代码&#xff0c;比如调试app&a…

3.x86游戏实战-寄存器

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;2.x86游戏实战-跨进程读取血量 寄存器说明&#xff1a; 寄存器是处理器的一部&…

ElementUI组件

目录 1、安装ElementUI 2、在main.js文件中加入 3、使用组件 终端运行&#xff1a; Element&#xff0c;一套为开发者、设计师和产品经理准备的基于Vue2.0的桌面端组件库. 1、安装ElementUI 控制台输入 npm i element-ui -S 2、在main.js文件中加入 import ElementUI from…

多模态语言模型的新突破:Reka Core、Flash和Edge系列

人工智能领域的每一次技术革新都可能引领一场行业的变革&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;多模态语言模型&#xff08;MLMs&#xff09;正逐渐成为推动智能系统发展的核心力量。Reka团队最新推出的Reka Core、Flash和Edge系列模型&…

经典排序算法详解

目录 创作不易&#xff0c;如对您有帮助&#xff0c;还望一键三连&#xff0c;谢谢&#xff01; 前言 学习目标&#xff1a; 直接插入排序 基本思想&#xff1a; 代码 希尔排序&#xff1a; gap取值 代码 特性总结 选择排序 基本思想 代码 堆排序 思想 代码 冒…