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

目录

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匹配正则表达式模式,则认为它是有效的,并打印相应消息;否则,打印无效消息。最后,程序释放与正则表达式相关的资源。程序运行结果如下:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring学习01-[Spring实现IOC的几种方式]

Spring实现IOC的几种方式 基于xml实现Spring的IOC基于注解实现Spring的IOC基于JavaConfig实现的Spring的IOC基于SpringBoot实现Spring的IOC 基于xml实现Spring的IOC 引入spring核心依赖 <!--spring核心容器--><dependency><groupId>org.springframework<…

14 卡尔曼滤波及代码实现

文章目录 14 卡尔曼滤波及代码实现14.0 基本概念14.1 公式推导14.2 代码实现 14 卡尔曼滤波及代码实现 14.0 基本概念 卡尔曼滤波是一种利用线性系统状态方程&#xff0c;通过系统输入输出观测数据&#xff0c;对系统状态进行最优估计的算法。由于观测数据包括系统中的噪声和…

【智能制造-4】机器人控制器

机器人控制器中分哪几个模块&#xff1f; 机器人控制器通常由以下几个主要模块组成: 运动控制模块: 负责机器人各轴电机的位置、速度、加速度等控制 实现机器人末端执行器的精确定位和运动控制传感器接口模块: 负责机器人各种传感器信号的采集和处理 为运动控制、环境感知等提…

实用的vueuseHooks,提高编码效率

文章目录 写在前面vueuse 官网安装HooksuseStorage [地址](https://vueuse.org/core/useStorage/)传统方法数据持久化 举例子传统持久化的弊端useStorage 数据持久化 举例子使用useStorage 更改存储数据使用useStorage 删除存储数据 useScriptTag [地址](https://vueuse.org/co…

Detailed Steps for Troubleshooting ORA-00600 [kdsgrp1] (文档 ID 1492150.1)

Detailed Steps for Troubleshooting ORA-00600 [kdsgrp1] (文档 ID 1492150.1)​编辑转到底部 In this Document Purpose Troubleshooting Steps References APPLIES TO: Oracle Database - Enterprise Edition Oracle Database Cloud Schema Service - Version N/A and lat…

鸿蒙开发Ability Kit(程序框架服务):【选择申请权限的方式】

选择申请权限的方式 应用在访问数据或者执行操作时&#xff0c;需要评估该行为是否需要应用具备相关的权限。如果确认需要目标权限&#xff0c;则需要在应用安装包中申请目标权限。 每一个权限的权限等级、授权方式不同&#xff0c;申请权限的方式也不同&#xff0c;开发者在…

41割队伍

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/387 题目描述 给定 𝑛n 个数字 𝑎1,�…

MySQL高级-MVCC-基本概念(当前读、快照读)

文章目录 1、MVCC基本概念1.1、当前读1.1.1、创建表 stu1.1.2、测试 1.2、快照读 1、MVCC基本概念 全称Multi-Version Concurrency Control&#xff0c;多版本并发控制。指维护一个数据的多个版本&#xff0c;使得读写操作没有冲突&#xff0c;快照读为MySQL实现MVCC提供了一个…

网易云音乐数据爬取与可视化分析系统

摘要 本系统采用Python语言&#xff0c;基于网易云音乐&#xff0c;通过数据挖掘技术对该平台的音乐数据进行了深入的研究和分析&#xff0c;旨在挖掘出音乐市场的规律&#xff0c;为音乐人、唱片公司、音乐爱好者等提供数据支持。系统的开发意义在于&#xff1a;一方面为音乐…

flink 处理函数和流转换

目录 处理函数分类 概览介绍 KeydProcessFunction和ProcessFunction 定时器TimeService 窗口处理函数 多流转换 分流-侧输出流 合流 联合&#xff08;Uniion&#xff09; 连接&#xff08;connect&#xff09; 广播连接流&#xff08;BroadcatConnectedStream&#xf…

大模型微调实战之基于星火大模型的群聊对话分角色要素提取挑战赛:Task01:跑通Baseline

目录 0 背景1 环境配置1.1 下载包1.2 配置密钥1.3 测试模型 2 解决问题2.1 获取数据2.2 设计Prompt2.2 设计处理函数2.3 开始提取 附全流程代码 0 背景 Datawhale AI夏令营第二期开始啦&#xff0c;去年有幸参与过第一期&#xff0c;收获很多&#xff0c;这次也立马参与了第二…

昇思MindSpore学习笔记5--数据变换Transforms

摘要&#xff1a; 昇思MindSpore的数据变换&#xff0c;包括通用变换Common Transforms、图像变换Vision Transforms、标准化Normalize、文本变换Text Transforms、匿名函数变换Lambda Transforms。 一、数据变换Transforms概念 原始数据需预处理后才能送入神经网络进行训练…

【网络】计算机网络-基本知识

目录 概念计算机网络功能计算机网络的组成计算机网络的分类 网络地址网络地址的分类 计算机网络相关性能指标速率带宽吞吐量时延时延的种类&#xff1a; 时延带宽积往返时延RTT利用率 概念 计算机网络是指将多台计算机通过通信设备连接起来&#xff0c;实现数据和资源的共享。…

spring mvc实现一个自定义Formatter请求参数格式化

使用场景 在Spring Boot应用中&#xff0c;Formatter接口用于自定义数据的格式化&#xff0c;比如将日期对象格式化为字符串&#xff0c;或者将字符串解析回日期对象。这在处理HTTP请求和响应时特别有用&#xff0c;尤其是在展示给用户或从用户接收特定格式的数据时。下面通过…

Arthas快速入门

简介 Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时&#xff0c;类…

3.3V到5V的负电源产生电路(电荷泵电压反相器)SGM3204输出电流0.2A封装SOT23-6

前言 SGM3204 非稳压 200mA 电荷泵负电源产生电路&#xff0c;LCEDA原理图请访问资源 SGM3204电荷泵负电源产生电路 SGM3204电荷泵负电源产生电路 一般描述 SGM3204从 1.4V 至 5.5V 的输入电压范围产生非稳压负输出电压。 该器件通常由 5V 或 3.3V 的预稳压电源轨供电。由于…

ElementUI的基本搭建

目录 1&#xff0c;首先在控制终端中输入下面代码&#xff1a;npm i element-ui -S 安装element UI 2&#xff0c;构架登录页面&#xff0c;login.vue​编辑 3&#xff0c;在官网获取对应所需的代码直接复制粘贴到对应位置 4&#xff0c;在继续完善&#xff0c;从官网添加…

OverTheWire Bandit 靶场通关解析(中)

介绍 OverTheWire Bandit 是一个针对初学者设计的网络安全挑战平台&#xff0c;旨在帮助用户掌握基本的命令行操作和网络安全技能。Bandit 游戏包含一系列的关卡&#xff0c;每个关卡都需要解决特定的任务来获取进入下一关的凭证。通过逐步挑战更复杂的问题&#xff0c;用户可…

14-7 为什么你的梦想职业可能会扼杀你的梦想

照片由Johnny Cohen在Unsplash拍摄 “做好工作的唯一方法就是热爱你所做的事情。如果你还没有找到&#xff0c;那就继续寻找。不要安于现状。”——史蒂夫乔布斯 等一下&#xff0c;什么&#xff1f; 这不是一篇关于无聊工作的文章吗&#xff1f;我为什么要用一句完全违背前提…

windows@文件高级共享设置@网络发现功能@从资源管理器网络中访问远程桌面

文章目录 高级共享设置常用选项其他选项操作界面说明 网络类型检查和设置(专用网络和公用网络)&#x1f47a;Note 高级共享设置和防火墙&#x1f47a;命令行方式使用图形界面方式配置 网络发现网络发现功能的详细介绍网络发现的作用&#x1f47a;网络发现的工作原理启用和配置网…