嵌入式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 1024int 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;// 请求用户输入URLprintf("请输入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.rhkb.cn/news/364275.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【小学期】常用基于Swing的七个静态界面

示例1&#xff1a;基本的带按钮和标签的界面 import javax.swing.*; import java.awt.*;public class SimpleSwingApp1 {public static void main(String[] args) {JFrame frame new JFrame("Simple Swing App 1");frame.setDefaultCloseOperation(JFrame.EXIT_ON_C…

5个大气的wordpress付费主题

Sesko赛斯科wordpress外贸主题 适合用于重型机械设备公司建外贸官方网站的橙红色wordpress外贸主题。 https://www.jianzhanpress.com/?p5886 Polar钋啦wordpress外贸主题 制造业wordpress网站模板&#xff0c;适合生产制造企业官方网站使用的wordpress外贸主题。 https:/…

识图生成代码:通义千问vsGPt4o,有点小崩

今日对比一下通义千问和GPt4o&#xff0c;在通过识别图片然后去生成前端代码 在当今ai的时代&#xff0c;通过ai去生成页面的代码可以很大的提高我们的开发效率下面是我们要求的生成的图片截图&#xff0c;这是掘金的榜单 效果对比 首先我们使用通义千问&#xff0c;让他去帮我…

学校消防设施设备管理系统

建立和落实校园消防安全管理责任制,做到消防安全工作有人专管,部门和岗位有人落实的日常管理&#xff0c;及时发现消防安全隐患,及时反映,及时处理,杜绝校园内消防安全隐患。 凡尔码平台搭建学校消防设施设备管理系统可以通过设备管理系统对消防器材设施基本信息、设施有效期、…

[leetcode]avoid-flood-in-the-city 避免洪水泛滥

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> avoidFlood(vector<int>& rains) {vector<int> ans(rains.size(), 1);set<int> st;unordered_map<int, int> mp;for (int i 0; i < rains.size(); i) {i…

运维锅总详解HAProxy

本文尝试从HAProxy简介、HAProxy工作流程及其与Nginx的对比对其进行详细分析&#xff1b;在本文最后&#xff0c;给出了为什么Nginx比HAProxy更受欢迎的原因。希望对您有所帮助&#xff01; HAProxy简介 HAProxy&#xff08;High Availability Proxy&#xff09;是一款广泛使…

Springboot 整合 DolphinScheduler(二):UI页面上的主要功能介绍

&#x1f4cd;当前部署情况&#xff1a;DolphinScheduler V2.0.6 已经在三台服务器上安装完毕&#xff0c;具体如下&#xff1a; 角色 服务器IP master 192.168.1.247 master 192.168.1.248 worker 192.168.1.249 &#x1f4c2; 具体搭建过程&#xff1a;Springboot 整…

绕过命令过滤器:探索UnixLinux中的Bypass技术

前言 在Unix或Linux系统的安全测试和网络防御中&#xff0c;了解如何绕过命令过滤器是非常重要的。今天&#xff0c;我们将探讨几种利用shell命令绕过安全限制的技巧&#xff0c;这些技巧常用于渗透测试中&#xff0c;以检测系统的安全漏洞。 0x00 命令介绍 一般而言&#x…

ros1仿真导航机器人 hector_mapping gmapping

仅为学习记录和一些自己的思考&#xff0c;不具有参考意义。 1 hector_mapping 建图过程 &#xff08;1&#xff09;gazebo仿真 roslaunch why_simulation why_slam.launch <launch><!-- We resume the logic in empty_world.launch, changing only the name of t…

算法-位运算基础

文章目录 前置知识1. 交换两个数2. 比较两个数的大小3. leetcode268 寻找缺失的数字4. leetcode136 只出现一次的数字5. leetcode260 只出现一次的数字|||6. leetcode137 只出现一次的数字||7. 2/3的幂8. 大于等于该数字的最小2的幂9. leetcode201 数字范围按位与10. 位运算中分…

effective java (1)(考虑使用!)静态工厂方法代替构造方法

只是目前阶段 对本书第一章内容的浅显认知&#xff0c;说实话 这一章 我看了4遍左右&#xff0c;每一遍感觉都不一样 他的创建模式 有时候像设计模式&#xff0c;但作者已经在原文中描述&#xff0c;它并不等价于 设计模式 我们正常 创建一个年级类 是长这样的 我们不写成标准…

C语言 for循环

for循环语句 //初始化 //判断 //调整 for&#xff08;表达式1; 表达式2; 表达式3;&#xff09;循环语句; 例&#xff1a; for循环里break for循环里continue 注&#xff1a;1.不可在for循环体内修改循环变量&#xff0c;防止for循环失去控制 2.建议for语句的循环控制变量的…

open-chat-video-editor:开源短视频生成和编辑工具,以及抖音|TikTok 的移动端短视频项目

open-chat-video-editor&#xff1a;开源短视频生成和编辑工具&#xff0c;以及抖音|TikTok 的移动端短视频项目。 open-chat-video-editor&#xff1a;开源短视频生成和编辑工具 简介 Open Chat Video Editor是开源的短视频生成和编辑工具&#xff0c;整体技术框架如下&…

简单科普-GPT到底是什么?

1.ChatGPT ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;是OpenAI研发的一款聊天机器人程序 &#xff0c;于2022年11月30日发布 。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够基于在预训练阶段所见…

[深度学习] Transformer

Transformer是一种深度学习模型&#xff0c;最早由Vaswani等人在2017年的论文《Attention is All You Need》中提出。它最初用于自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;但其架构的灵活性使其在许多其他领域也表现出色&#xff0c;如计算机视觉、时间序列分析…

HarmonyOS Next开发学习手册——选项卡 (Tabs)

当页面信息较多时&#xff0c;为了让用户能够聚焦于当前显示的内容&#xff0c;需要对页面内容进行分类&#xff0c;提高页面空间利用率。 Tabs 组件可以在一个页面内快速实现视图内容的切换&#xff0c;一方面提升查找信息的效率&#xff0c;另一方面精简用户单次获取到的信息…

Redis Stream Redisson Stream

目录 一、Redis Stream1.1 场景1&#xff1a;多个客户端可以同时接收到消息1.1.1 XADD - 向stream添加Entry&#xff08;发消息 &#xff09;1.1.2 XREAD - 从stream中读取Entry&#xff08;收消息&#xff09;1.1.3 XRANGE - 从stream指定区间读取Entry&#xff08;收消息&…

【王佩丰 Excel 基础教程】第一讲:认识Excel

文章目录 前言一、Excel软件简介1.1、历史上的其他数据处理软件与 Microsoft Excel1.2、Microsoft Excel 能做些什么1.3、Excel 界面介绍 二、Microsoft Excel 的一些重要概念2.1、Microsoft Excel 的几种常见文件类型2.2、工作簿、工作表、单元格. 三、使用小工具&#xff1a;…

SpringDataJPA系列(1)JPA概述

SpringDataJPA系列(1)JPA概述 SpringDataJPA似乎越来越流行了&#xff0c;我厂的mysql数据库和MongoDB数据库持久层都依赖了SpringDataJPA。为了更好的使用它&#xff0c;我们内部还对MongoDB的做了进一步的抽象和封装。为了查漏补缺&#xff0c;温故而知新&#xff0c;整理下…

基于自组织长短期记忆神经网络的时间序列预测(MATLAB)

LSTM是为了解决RNN 的梯度消失问题而诞生的特殊循环神经网络。该网络开发了一种异于普通神经元的节点结构&#xff0c;引入了3 个控制门的概念。该节点称为LSTM 单元。LSTM 神经网络避免了梯度消失的情况&#xff0c;能够记忆更长久的历史信息&#xff0c;更能有效地拟合长期时…