「C/C++」C/C++正则表达式

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「UG/NX」NX二次开发「UG/NX」BlockUI集合
「VS」Visual Studio「QT」QT5程序设计
「C/C++」C/C++程序设计「Win」Windows程序设计
「DSA」数据结构与算法「File」数据文件格式

目录

  • 术语介绍
  • 匹配代码
    • 常用标识
    • 转义字符
    • 贪婪与懒惰
  • 常用匹配举例
    • 1. 验证输入数据的格式:
    • 2. 提取文本中的特定信息:
    • 3. 替换文本中的特定模式:
    • 4. 分割文本为不同的单词或句子:
  • C++标准库#include<regex\>​
    • 1. `std::regex`
    • 2. `std::regex_match`
    • 3. `std::regex_search`
    • 4. `std::regex_replace`
    • 5. `std::sregex_iterator`
  • 参考文献


术语介绍

正则表达式说明:

  • 正则表达式:是一种用于描述和匹配字符串模式的工具。

正则表达式功能:

  • 模式匹配:检查一个字符串是否与指定模式匹配。
  • 字符串搜索和替换:在一个文本中搜索并替换符合规则的字符序列。
  • 字符串分割:根据模式将字符串切分成多个部分。
  • 校验输入:对用户输入进行验证,以确保其符合特定格式要求。
  • 数据提取:从字符串中抽取特定的信息、数据或属性。

在线正则表达式测试工具【英文】:https://regex101.com/
在线正则表达式测试工具【中文】:https://regexr-cn.com/
在线正则表达式练习工具:https://www.codejiaonang.com/#/courses
在线正则表达式说明工具:https://r2coding.com

匹配代码

常用标识

字符标识含义
.除换行符外的任意字符
*前面的子表达式零次或多次
+前面的子表达式一次或多次
?前面的子表达式零次或一次
|或运算符。并集,可以匹配符号前后的表达式。
[]匹配方括号中列举的任意一个字符
[^]匹配除了方括号中列举的任意一个字符以外的任意字符
()捕获组,用于分组和提取匹配结果
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次
\d任意一个数字字符(0-9)
\D任意一个非数字字符
\w任意一个单词字符(字母、数字、“_”)
\W任意一个非单词字符
\s任意一个空白字符(空格、制表符、换行符等)
\S任意一个非空白字符
\b单词边界
\B非单词边界
^行的开头(或在 [] 中表示取反)
$行的结尾
\转义字符,用于转义特殊字符

转义字符

转义字符说明
\n换行
\t横向跳格(制表符)
\v竖向跳格
\b退格
\r回车
\f走纸换页
\\反斜杠字符 \
\'单引号字符
\a鸣玲
\ddd1到3位八进制数所代表的字符
​​\xhh以十六进制表示的字符(例如,​\x41​ 表示大写字母 ‘A’)
​​\uhhhh​ 以十六进制表示的 Unicode 字符(例如,​\u0041​ 表示大写字母 ‘A’)
​​\Uhhhhhhhh以十六进制表示的长形式 Unicode 字符

贪婪与懒惰

代码说明
*?重复任意次,但尽可能少重复
+?重复1次或更多次,但尽可能少重复
??重复0次或1次,但尽可能少重复
{n,m}?重复n到m次,但尽可能少重复
{n,}?重复n次以上,但尽可能少重复

常用匹配举例

1. 验证输入数据的格式:

  • 邮箱地址:^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
  • 网络地址:^(?:https?:\/\/)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$
  • 手机号码:/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/gm
  • 身份证号码:^[1-9]\\d{5}(18|19|20)\\d{2}(0\\d|10|11|12)([0-2]\\d|30|31)\\d{3}[0-9Xx]$

2. 提取文本中的特定信息:

  • 匹配HTML标签中的内容:<([a-zA-Z]+)(?:\\s+[a-zA-Z]+=\"[^\"]*\")*>\\s*([\\w\\W]*?)\\s*</\\1>
  • 匹配URL中的域名:(https?|ftp)://([\\w_-]+(\\.[\\w_-]+)+)(:[0-9]+)?(/\\S*)?

3. 替换文本中的特定模式:

  • 将日期格式从"YYYY/MM/DD"替换为"DD-MM-YYYY":(\d{4})/(\d{2})/(\d{2}) 替换为 \3-\2-\1
  • 删除多余的连续空白字符:\s+ 替换为空格

4. 分割文本为不同的单词或句子:

  • 以逗号和空格分割句子:\\s*,\\s*

C++标准库#include<regex>​

所属头文件:#include<regex>​

组件名称作用
std::regex表示一个正则表达式的对象
std::regex_match将一个字符序列与正则表达式进行完全匹配
std::regex_search在字符序列中搜索满足正则表达式的第一个子序列
std::regex_replace使用给定的格式替换字符串中满足正则表达式的部分
std::sregex_iterator迭代器适配器,用于遍历字符串中所有与正则表达式匹配的子序列
std::smatch存储与正则表达式匹配的结果的容器类
std::ssub_match存储在字符串中与子表达式匹配的结果的容器类

1. std::regex

#include <iostream>
#include <regex>

int main() {
    std::string input = "Hello, World!";
    std::regex pattern("Hello");

    if (std::regex_match(input, pattern)) {
        std::cout << "Pattern matched." << std::endl;
    } else {
        std::cout << "Pattern not matched." << std::endl;
    }

    return 0;
}

2. std::regex_match

#include <iostream>
#include <regex>

int main() {
    std::string input = "1234";
    std::regex pattern("\\d+");

    if (std::regex_match(input, pattern)) {
        std::cout << "Input string matches the pattern." << std::endl;
    } else {
        std::cout << "Input string does not match the pattern." << std::endl;
    }

    return 0;
}

3. std::regex_search

#include <iostream>
#include <regex>

int main() {
    std::string input = "Hello, World!";
    std::regex pattern("World");

    std::smatch match;
    if (std::regex_search(input, match, pattern)) {
        std::cout << "Pattern found: " << match.str() << std::endl;
    } else {
        std::cout << "Pattern not found." << std::endl;
    }

    return 0;
}

4. std::regex_replace

#include <iostream>
#include <regex>

int main() {
    std::string input = "Hello, World!";
    std::regex pattern("World");

    std::string replaced = std::regex_replace(input, pattern, "Universe");
    std::cout << "Replaced string: " << replaced << std::endl;

    return 0;
}

5. std::sregex_iterator

#include <iostream>
#include <regex>

int main() {
    std::string input = "Hello, 2021! This is a sample string with numbers 1234.";

    std::regex pattern("\\d+");
    std::sregex_iterator iter(input.begin(), input.end(), pattern);
    std::sregex_iterator end;

    std::cout << "Matches found: ";
    for (; iter != end; ++iter) {
        std::cout << iter->str() << " ";
    }
    std::cout << std::endl;

    return 0;
}

参考文献

正则表达式30分钟入门教程——作者:deerchao
微软.NET正则表达式

在这里插入图片描述

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

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

相关文章

无涯教程-Perl - bless函数

描述 此函数告诉REF引用的实体,它现在是CLASSNAME包中的对象,如果省略CLASSNAME,则为当前包中的对象。建议使用bless的两个参数形式。 语法 以下是此函数的简单语法- bless REF, CLASSNAMEbless REF返回值 该函数返回对祝福到CLASSNAME中的对象的引用。 例 以下是显示其…

基于R做宏基因组的进化树ClusterTree分析

写在前面 同上一篇的PCoA分析&#xff0c;这个也是基于公司结果基础上的再次分析&#xff0c;重新挑选样本&#xff0c;在公司结果提供的csv结果表上进行删减&#xff0c;本地重新分析作图 步骤 表格预处理 在公司给的ClusterTree的原始表格数据里选取要保留的样本&#xf…

Python接口自动化之request请求封装

我们在做自动化测试的时候&#xff0c;大家都是希望自己写的代码越简洁越好&#xff0c;代码重复量越少越好。那么&#xff0c;我们可以考虑将request的请求类型&#xff08;如&#xff1a;Get、Post、Delect请求&#xff09;都封装起来。这样&#xff0c;我们在编写用例的时候…

日常BUG——使用Long类型作id,后端返回给前段后精度丢失问题

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 数据库long类型Id: 前端返回的Id实体类: Data ApiModel("xxx") public class …

chatGPT小白快速入门培训课程-001

一、前言 本文是《chatGPT小白快速入门培训课程》的第001篇文章&#xff0c;全部内容采用chatGPT和chatGPT开源平替软件生成。完整内容大纲详见&#xff1a;《chatGPT小白快速入门课程大纲》。 本系列文章&#xff0c;参与&#xff1a; AIGC征文活动 #AIGC技术创作内容征文# …

Vue 整合 Element UI 、路由嵌套和参数传递(五)

一、整合 Element UI 1.1 工程初始化 使用管理员的模式进入 cmd 的命令行模式&#xff0c;创建一个名为 hello-vue 的工程&#xff0c;命令为&#xff1a; # 1、目录切换 cd F:\idea_home\vue# 2、项目的初始化&#xff0c;记得一路的 no vue init webpack hello-vue 1.2 安装…

STL文件格式详解【3D】

STL&#xff08;StereoLithography&#xff1a;立体光刻&#xff09;文件是 3 维表面几何形状的三角形表示。 表面被逻辑地细分或分解为一系列小三角形&#xff08;面&#xff09;。 每个面由垂直方向和代表三角形顶点&#xff08;角&#xff09;的三个点来描述。 切片算法使用…

Python实战之使用Python进行数据挖掘详解

一、Python数据挖掘 1.1 数据挖掘是什么&#xff1f; 数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中&#xff0c;通过算法&#xff0c;找出其中的规律、知识、信息的过程。Python作为一门广泛应用的编程语言&#xff0c;拥有丰富的数据挖掘库&#…

Python-OpenCV中的图像处理-颜色空间转换

Python-OpenCV中的图像处理-颜色空间转换 颜色空间转换获取HSV的值 颜色空间转换 在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会 发现我们经常用到的也就两种&#xff1a; BGR G r a y 和 B G R Gray 和 BGR Gray和BGRHSV。 注意&#xff1a;在 OpenCV 的…

C语言实现选择排序

什么是选择排序&#xff1f; 选择排序是一种简单直观的排序算法&#xff0c;它的核心思想是每次从未排序的元素中选择最小&#xff08;或最大&#xff09;的元素&#xff0c;然后将其放到已排序序列的末尾。通过重复这个过程&#xff0c;直到所有元素都排好序为止。 选择排序…

计算机网络 网络层 IPv4地址

A类地址第一位固定0 B类10 其下同理

Grafana V10 告警推送 邮件

最近项目建设完成&#xff0c;一个城域网项目&#xff0c;相关zabbix和grafana展示已经完&#xff0c;想了想&#xff0c;不想天天看平台去盯网络监控平台&#xff0c;索性对告警进行分类调整&#xff0c;增加告警的推送&#xff0c;和相关部门的提醒&#xff0c;其他部门看不懂…

PHP利用PCRE回溯次数限制绕过某些安全限制实战案例

目录 一、正则表达式概述 有限状态自动机 匹配输入的过程分别是&#xff1a; DFA&#xff08;确定性有限状态自动机&#xff09; NFA&#xff08;非确定性有限状态自动机&#xff09; 二、回溯的过程 三、 PHP 的 pcre.backtrack_limit 限制利用 例题一 回溯绕过步骤 &…

山西电力市场日前价格预测【2023-08-13】

日前价格预测 预测明日&#xff08;2023-08-13&#xff09;山西电力市场全天平均日前电价为351.64元/MWh。其中&#xff0c;最高日前电价为404.00元/MWh&#xff0c;预计出现在19: 30。最低日前电价为306.39元/MWh&#xff0c;预计出现在13: 15。 价差方向预测 1&#xff1a; 实…

《甲午》观后感——GPT-3.5所写

《甲午》是一部令人深思的纪录片&#xff0c;通过生动的画面和真实的故事&#xff0c;向观众展示了中国历史上的一段重要时期。观看这部纪录片&#xff0c;我深受触动&#xff0c;对历史的认识也得到了深化。 首先&#xff0c;这部纪录片通过精心搜集的历史资料和珍贵的影像资料…

stable-diffusion 模型效果+prompt

摘自个人印象笔记&#xff0c;图不完整可查看原笔记&#xff1a;https://app.yinxiang.com/fx/55cda0c6-2af5-4d66-bd86-85da79c5574ePrompt运用规则及技巧 &#xff1a; 1. https://publicprompts.art/&#xff08;最适用于OpenArt 线上模型 https://openart.ai/&#xff09;…

数据库数据恢复-Oracle数据库数据恢复案例

数据库数据恢复环境&#xff1a; Oracle数据库ASM磁盘组有4块成员盘。 数据库故障&分析&#xff1a; Oracle数据库ASM磁盘组掉线 &#xff0c;ASM实例无法挂载&#xff0c;用户联系我们要求恢复oracle数据库。 数据库数据恢复工程师拿到磁盘后&#xff0c;先将所有磁盘以只…

【深度学习】再谈向量化

前言 向量化是一种思想&#xff0c;不仅体现在可以将任意实体用向量来表示&#xff0c;更为突出的表现了人工智能的发展脉络。向量的演进过程其实都是人工智能向前发展的时代缩影。 1.为什么人工智能需要向量化 电脑如何理解一门语言&#xff1f;电脑的底层是二进制也就是0和1&…

centos7 安装 docker 不能看菜鸟教程的 docker 安装,有坑

特别注意 不能看菜鸟教程的 docker 安装&#xff0c;有坑 如果机器不能直接上网&#xff0c;先配置 yum 代理 proxyhttp://172.16.0.11:8443 配置文件修改后即刻生效&#xff0c;再执行 yum install 等命令&#xff0c;就可以正常安装软件了。 参考 https://blog.csdn.net/c…

RCNA——单臂路由

一&#xff0c;实验背景 之前的VLAN实现的很多都是相同部门互相访问&#xff0c;不同部门无法访问。不过这次整来了一个路由器&#xff0c;领导说大部分的部门虽说有保密信息需要互相隔离&#xff0c;但是这些部门和其它部门也应该互相连通以方便工作交流。因此要配置新的环境&…