正则表达式的简单介绍 + regex_match使用

正则表达式

正则表达式(Regular Expression,简称 regex)是一种用于匹配字符串的模式。它由一系列字符和特殊符号组成,用于描述、匹配一系列符合某个句法规则的字符串。正则表达式广泛应用于文本搜索、替换、验证等场景。

它的主要功能包括:模式匹配,可以识别特定格式的字符串,例如电子邮件地址、电话号码等;字符串搜索,在大量文本中快速找到符合特定模式的内容;文本替换,可以根据匹配的模式,对字符串进行替换操作;验证输入,检查用户输入是否符合预定格式(如密码复杂度、日期格式等),等等。

主要应用方面包括:数据清洗,在数据处理和分析中,去除无效或不必要的文本;Web开发,验证表单输入、解析URL等;文本编辑器,搜索和替换功能;编程语言,在代码中处理字符串的复杂需求,等等。

总的来说,正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。

组成符号

正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,我们下面会给予解释。

在最简单的情况下,一个正则表达式看上去就是一个普通的查找串。例如,正则表达式"testing"中没有包含任何元字符,它可以匹配"testing"和"testing123"等字符串,但是不能匹配"Testing"。

要想真正的用好正则表达式,正确的理解元字符是最重要的事情。下表列出了所有的元字符和对它们的一个简短的描述。

regex_match

regex_match 是 C++ 标准库 <regex> 中的一个函数,用于从字符串中提取匹配的子串。这种形式允许将匹配的结果存储在 std::smatch 对象中,以便进一步处理。

bool regex_match(
    const std::string& src,      // 原始字符串
    std::smatch& matches,        // 存储匹配结果的容器
    const std::regex& e          // 正则表达式
);

参数说明

const std::string& src:要匹配的原始字符串。 std::smatch& matches:用于存储匹配结果的容器。std::smatch 是 std::match_results 的一个特化版本,专门用于 std::string。

它类似于一个数组,可以通过索引访问匹配的子串:

  • matches[0]:整个匹配的字符串。

  • matches[1]:第一个捕获组(即第一个括号内的内容)。

  • matches[2]:第二个捕获组,以此类推。

const std::regex& e:类型为 const std::regex&,是一个已经编译好的正则表达式对象。std::regex 用于表示一个正则表达式模式,通过它可以对输入字符串进行匹配操作。

返回值

如果整个字符串 src 完全匹配正则表达式 e,返回 true。否则,返回 false。

使用示例

#include <iostream>
#include <regex>
#include <string>

int main() {
    std::string src = "hello123";
    std::regex e("(hello)(\\d+)");
    std::smatch matches;

    if (std::regex_match(src, matches, e)) {
        std::cout << "整个匹配的字符串: " << matches[0] << std::endl;
        std::cout << "第一个捕获组: " << matches[1] << std::endl;
        std::cout << "第二个捕获组: " << matches[2] << std::endl;
    } else {
        std::cout << "字符串不匹配正则表达式" << std::endl;
    }

    return 0;
}

在这个示例中,我们尝试将字符串 "hello123" 与正则表达式 "(hello)(\\d+)" 进行匹配。正则表达式中的 (hello) 是第一个捕获组,(\\d+) 是第二个捕获组,用于匹配一个或多个数字。如果匹配成功,会输出整个匹配的字符串以及各个捕获组的内容;如果匹配失败,则会输出相应的提示信息。

需要注意的是,std::regex_match 要求整个输入字符串都要与正则表达式完全匹配,如果只想查找字符串中是否包含符合正则表达式的子串,应该使用 std::regex_search 函数。

正则表达式的使用,可以使得HTTP请求的解析更加简单(这里指的时程序员的工作变得的简单,这并不代表处理效率会变高,实际上效率上是低于直接的字符串处理的),使我们实现的HTTP组件库使用起来更加灵活。

#include <iostream>
#include <string>
#include <regex>

int main()
{
    // HTTP 请求行格式  GET /index.html HTTP/1.1\r\n 请求方法+资源路径(+查询字符串)+HTTP版本
    std::string str = "GET /wuxu/login?user=xiaoming&pass=123123 HTTP/1.1\r\n";
    // std::string str = "GET /wuxu/login HTTP/1.1\r\n";
    std::smatch matches;
    // 请求方法的匹配 GET HEAD POST PUT DELETE ...
    std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?");
    /*
    GET|HEAD|POST|PUT|DELETE 表示匹配并提取其中任意一个字符串
    [^?]* [^?]匹配非问号字符,后边的*表示0次或多次
    \\?(.*) \\? 表示原始的?字符(.*)表示提取?之后的任意字符0次或多次,直到遇到空格
    HTTP/1\\.[01] 表示匹配HTTP/1.开始,后边有个0或1的字符串
    (?:\n|\r\n)? (?: ...)表示匹配某个格式字符串,但是不提取 最后的?表示的是匹配前边的表达式0次或1次
    */

    bool ret = std::regex_match(str, matches, e);
    if(ret == false) return -1;
    for(auto& s : matches)
        std::cout << s << std::endl;

    return 0;
}

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

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

相关文章

AnythingLLM开发者接口API测试

《Win10OllamaAnythingLLMDeepSeek构建本地多人访问知识库》见上一篇文章&#xff0c;本文在上篇基础上进行。 1.生成本地API 密钥 2.打开API测试页面&#xff08;http://localhost:3001/api/docs/&#xff09; 就可以在页面测试API了 2.测试获取用户接口(/v1/admin/users) 3…

TypeScript 中的类:面向对象编程的基础

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

二级C语言题解:矩阵主、反对角线元素之和,二分法求方程根,处理字符串中 * 号

目录 一、程序填空&#x1f4dd; --- 矩阵主、反对角线元素之和 题目&#x1f4c3; 分析&#x1f9d0; 二、程序修改&#x1f6e0;️ --- 二分法求方程根 题目&#x1f4c3; 分析&#x1f9d0; 三、程序设计&#x1f4bb; --- 处理字符串中 * 号 题目&#x1f…

Qt 支持的动画格式对比,Lottie/APNG/GIF/WEBP

Qt版本&#xff1a;6.7.2 &#xff0c; QML 一&#xff0c;Lottie 在qml中使用LottieAnimation即可&#xff0c;但有三个问题&#xff1a; 1.动画加载中报错&#xff1a; 如果图片&#xff08;.json)本身存在不支持的effect 或shape type等&#xff0c;效果并不好&#xff1a…

SpringCloud - Nacos注册/配置中心

前言 该博客为Nacos学习笔记&#xff0c;主要目的是为了帮助后期快速复习使用 学习视频&#xff1a;7小快速通关SpringCloud 辅助文档&#xff1a;SpringCloud快速通关 一、简介 Nacos官网&#xff1a;https://nacos.io/docs/next/quickstart/quick-start/ Nacos /nɑ:kəʊ…

老游戏回顾:TL2

TL2是一部ARPG游戏&#xff0c;是TL的续作游戏&#xff0c;由位于美国西雅图的Runic Games开发&#xff0c;游戏于2012年9月20日上市&#xff0c;简体中文版于2013年4月10日在国内上市。 2有非常独特的艺术风格&#xff0c;这些在1中就已经形成&#xff0c;经过升级将使这款游…

DeepSeek-R1 云环境搭建部署流程

DeepSeek横空出世&#xff0c;在国际AI圈备受关注&#xff0c;作为个人开发者&#xff0c;AI的应用可以有效地提高个人开发效率。除此之外&#xff0c;DeepSeek的思考过程、思考能力是开放的&#xff0c;这对我们对结果调优有很好的帮助效果。 DeepSeek是一个基于人工智能技术…

利用ETL工具进行数据挖掘

ETL的基本概念 数据抽取&#xff08;Extraction&#xff09;&#xff1a;从不同源头系统中获取所需数据的步骤。比如从mysql中拿取数据就是一种简单的抽取动作&#xff0c;从API接口拿取数据也是。 数据转换&#xff08;Transformation&#xff09;&#xff1a;清洗、整合和转…

k8s网络插件及基础命令

一、k8s的cni网络插件 1.k8s的内部网络模式 pod内的容器与容器之间的通信。一个节点上的pod之间的通信&#xff0c;docker0网桥直接通信。不同节点上的pod之间的通信&#xff1a;通过物理网卡的ip地址和其他节点上的物理网卡的设备进行通信&#xff0c;然后把流量转发到指定的…

保姆级教程Docker部署KRaft模式的Kafka官方镜像

目录 一、安装Docker及可视化工具 二、单节点部署 1、创建挂载目录 2、运行Kafka容器 3、Compose运行Kafka容器 4、查看Kafka运行状态 三、集群部署 四、部署可视化工具 1、创建挂载目录 2、运行Kafka-ui容器 3、Compose运行Kafka-ui容器 4、查看Kafka-ui运行状态 …

【C语言】传值调用与传址调用详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;传值调用1. 什么是传值调用&#xff1f;2. 示例代码&#xff1a;传值调用失败的情况执行结果&#xff1a; 3. 为什么传值调用无法修改外部变量&#xff1f; &#x1f4…

HarmonyOS 5.0应用开发——ContentSlot的使用

【高心星出品】 文章目录 ContentSlot的使用使用方法案例运行结果 完整代码 ContentSlot的使用 用于渲染并管理Native层使用C-API创建的组件同时也支持ArkTS创建的NodeContent对象。 支持混合模式开发&#xff0c;当容器是ArkTS组件&#xff0c;子组件在Native侧创建时&#…

Golang:Go 1.23 版本新特性介绍

流行的编程语言Go已经发布了1.23版本&#xff0c;带来了许多改进、优化和新特性。在Go 1.22发布六个月后&#xff0c;这次更新增强了工具链、运行时和库&#xff0c;同时保持了向后兼容性。 Go 1.23 的新增特性主要包括语言特性、工具链改进、标准库更新等方面&#xff0c;以下…

11.PPT:世界动物日【25】

目录 NO12​ NO34 NO56​ NO789视频音频​ NO10/11/12​ NO12 设计→幻灯片大小→ →全屏显示&#xff08;16&#xff1a;9&#xff09;确定调整标题占位符置于图片右侧&#xff1a;内容占位符与标题占位符左对齐单击右键“世界动物日1”→复制版式→大小→对齐 幻灯片大小…

力扣.623. 在二叉树中增加一行(链式结构的插入操作)

Problem: 623. 在二叉树中增加一行 文章目录 题目描述思路复杂度Code 题目描述 思路 1.首先要说明&#xff0c;对于数据结构无非两大类结构&#xff1a;顺序结构、链式结构&#xff0c;而二叉树实质上就可以等效看作为一个二叉链表&#xff0c;而对于链表插入一个节点的操作是应…

Office/WPS接入DS等多个AI工具,开启办公新模式!

在现代职场中&#xff0c;Office办公套件已成为工作和学习的必备工具&#xff0c;其功能强大但复杂&#xff0c;熟练掌握需要系统的学习。为了简化操作&#xff0c;使每个人都能轻松使用各种功能&#xff0c;市场上涌现出各类办公插件。这些插件不仅提升了用户体验&#xff0c;…

yolov11模型在Android设备上运行【踩坑记录】

0) 参考资料: https://github.com/Tencent/ncnn?tabreadme-ov-file https://github.com/pnnx/pnnx https://github.com/nihui/ncnn-android-yolov5 https://github.com/Tencent/ncnn?tabreadme-ov-file 1) &#xff1a;将xxx.pt模型转化成 xxx.onnx ONNX&#xff08;Ope…

DeepSeek与llama本地部署(含WebUI)

DeepSeek从2025年1月起开始火爆&#xff0c;成为全球最炙手可热的大模型&#xff0c;各大媒体争相报道。我们可以和文心一言一样去官网进行DeepSeek的使用&#xff0c;那如果有读者希望将大模型部署在本地应该怎么做呢&#xff1f;本篇文章将会教你如何在本地傻瓜式的部署我们的…

arcgis for js范围内天地图高亮,其余底图灰暗

在GIS地图开发中&#xff0c;有时我们需要突出显示某个特定区域&#xff0c;而将其他区域灰暗处理&#xff0c;以达到视觉上的对比效果。本文将介绍如何使用ArcGIS for JavaScript实现这一功能&#xff0c;具体效果为&#xff1a;在指定范围内&#xff0c;天地图高亮显示&#…

基于微信小程序的医院预约挂号系统的设计与实现

hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生…