c++ 正则表达式-基础操作

C++语言的正则表达式 正则表达式(Regular Expressions)是一种用于字符串模式匹配的强大工具,它在文本处理、数据验证、文件搜索等许多场景中发挥着重要作用。在C++中,正则表达式的支持是通过标准库中的<regex>头文件实现的。自C++11标准引入以来,正则表达式在C++编程中变得越来越流行,尤其在数据处理和文本分析中。 阅读详情

    正则表达式是一个非常强大的工具,主要用于字符串匹配。如何在c++中使用正则表达式?下面就简要介绍一下c++中正则表达式相关函数的用法。
    本篇博客中所涉及到的函数及其功能如下表所示:

函数功能
regex_match(s,re)目标字符串s和正则表达式re是否完全匹配
regex_search(s,match_result,re)目标字符串s是否存在某个子串与正则表达式re匹配
regex_replace(s,re,s1)用s1替换目标字符串s中与正则表达式re匹配的子串

稍微详细一点再啰嗦两句:

  • regex_match(s,re),这个函数表中已经列出:判断正则表达式re和s是否完全匹配,能从头匹配到尾才叫完全。
  • regex_search(s,match_result,re),匹配s是否有子串能匹配re(可理解为re能不能匹配s中的一部分),如果能,就把匹配到的子串的相关信息存出match_result中,至于到底存了子串的哪些信息,参见regex_search函数的详细信息,关于match_result的基本使用下面的示例代码中会有所体现。
  • regex_replace(s,re,s1),替换函数,这里有个很神奇的地方就是s1,当s1中含有’$'时,替换得到的结果就会有所不同,具体见下面的示例代码。

上面说的一大堆基本没什么用,建议将示例代码粘去跑一跑,改一改,再跑一跑。

这里推荐一个特别好用的网址:能看见你的表达式在目标字符串中的匹配情况,对于正则表达式查错非常有用。传送门

示例代码:

#include <iostream>
#include <string>
#include <regex>
using namespace std;

void regex_match_test()
{
	/* std::regex_match:
		判断一个正则表达式(参数re)是否匹配整个字符序列str,它主要用于验证文本
		注意:  这个正则表达式必须匹配被分析串的全部,
			   否则返回false;如果整个序列被成功匹配,返回true
	*/
	string s = "ccaatt";
	vector<regex> regs;
	vector<string> patterns = {
		"ccaatt",
		"cca.tt",            // .    匹配除换行符以外的任意字符。
		"cca[a,b,c,d,e]tt",  // []   字符类,匹配方括号中包含的任意字符。
		"cc[^b,c,d,e]att",   // [^]  否定字符类。匹配方括号中不包含的任意字符
		"ccaa*tt",           // *    匹配前面的子表达式零次或多次
		"c+a+t+",            // +    匹配前面的子表达式一次或多次
		"cc?aatt?",          // ?    匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。 
		                     //      此处说明一下,出现一次或零次的意思可以理解为?前面的字符可出出现可不出现
							 //      注意它与 * 的区别 
		"ccaat{1,2}",        //{n,m} 花括号,匹配前面字符至少 n 次,但是不超过 m 次。 
		"(ccaatt)",          //(xyz)	字符组,按照确切的顺序匹配字符xyz。
		"(c(h|d|f)aatt)|(ccaatt)",    // |   分支结构,匹配符号之前的字符或后面的字符。
		                              // \   转义符,它可以还原元字符原来的含义,允许你匹配保留字符 [ ] ( ) { } . * + ? ^ $ \ |
	    "^ccaatt", 	 				  // ^   匹配行的开始
		"ccaatt$"   	     	      // $   匹配行的结束
	};
	
	for(int i = 0;i < patterns.size(); i++) 
		regs.push_back(regex(patterns[i]));
	
	for(int i = 0;i < regs.size(); i++)
	{
		if(regex_match(s,regs[i]))
			printf("use regex: %25s to match %10s [Match!]\n",patterns[i].c_str(),s.c_str());
		else
			printf("use regex: %25s to match %10s [Failed!]\n",patterns[i].c_str(),s.c_str());
	}
}

void regex_search_test()
{
	/* std::regex_search:
	类似于regex_match,但它不要求整个字符序列完全匹配
	可以用regex_search来查找输入中的一个子序列,
	注意regex_search匹配成功一个后面的不再匹配 
	*/
	
	string lines[] = {"Roses are #ff0000",
                      "violets are #0000ff",
                      "all of my base are belong to you"};
 
    regex color_regex("#[a-f0-9]{2}""[a-f0-9]{2}""[a-f0-9]{2}");
 
    // 简单匹配
    for (const auto &line : lines) {
        std::cout << line << ": " << std::boolalpha
                  << std::regex_search(line, color_regex) << '\n';
    }   
    std::cout << '\n';
 
    // 展示每个匹配中有标记子表达式的内容
    smatch color_match;
    for (const auto& line : lines) {
        if(regex_search(line, color_match, color_regex)) {
            cout << "matches for '" << line << "'\n";
            cout << "Prefix: '" << color_match.prefix() << "'\n";
            cout << color_match[0] << '\n';
            cout << "Suffix: '" << color_match.suffix() << "\'\n\n";
        }
    }
 
    // 重复搜索(参阅 std::regex_iterator )
    std::string log(R"(   \
        Speed:	366       \
        Mass:	35        \
        Speed:	378       \
        Mass:	32        \
        Speed:	400       \
		Mass:	30)");
    regex r(R"(Speed:\t\d*)");
    smatch sm;
    while(regex_search(log, sm, r))
    {
        std::cout << sm.str() << '\n';
        log = sm.suffix();
    }
 
    // C 风格字符串演示
    cmatch cm;
    if(regex_search("this is a test", cm, regex("test"))) 
        cout << "\nFound " << cm[0] << " at position " << cm.prefix().length() << endl;
}

void regex_replace_test()
{
	std::string text = "{{ name }} for brown fox",replace_result;
 	std::regex double_brace("(\\{\\{) (.*) (\\}\\})");
	
	//regex_replace返回值即为替换后的字符串 
	replace_result = regex_replace(text,double_brace,"*");
	cout << replace_result << "\n";
 
 	//构造存有结果的字符串,[$&]即为用[]将匹配成功部分括起来 
 	// $&	Inserts the matched substring.	 
	cout << regex_replace(text, double_brace, "[$&]") << '\n';
	
	// $i则输出double_brace中第i个括号匹配到的值 
	cout << regex_replace(text, double_brace, "$1") << '\n';
	cout << regex_replace(text, double_brace, "[$2]") << '\n';
	cout << regex_replace(text, double_brace, "$3") << '\n';
}

int main ()
{
	cout << "regex_match examples : " << endl;
	regex_match_test();
	
	cout << endl << "regex_search examples : " << endl;
	regex_search_test();
	
	cout << endl << "regex_replace examples : " << endl << endl;
	regex_replace_test();
	
	return 0;
}

参考链接:
翻译: 学习正则表达式的简单方法
正则表达式简介及在C++11中的简单使用
交互式正则表达式结果展示
Cpp标准库之 std::regex 类的使用
C++ 正则表达式示例
txt2re
javascript中$&的解释

突破编程_C++_高级教程(正则表达式) C++ 高级教程:正则表达式 阅读详情

相关推荐

C++字符串的隐藏技能:用正则表达式玩转花式搜索!保姆级教程来啦~

你的字符串需要“智能搜索外挂”

2302_80970336的博客 759

【C++】正则表达式

正则表达式

Daniel Leng的博客 1万+

C++正则表达式全攻略:从基础到高级使用

正则表达式是一组特定的字符序列,用于描述或匹配一组符合特定语法规则的字符串。在编程语言中,正则表达式可以用于搜索、查找和替换文本等操作。它被广泛应用于数据验证、文本解析、日志分析等多个领域,是数据处理和文本分析中不可或缺的工具。

weixin_29155599的博客 1091

C++标准库中正则表达式简介

C++标准库中正则表达式的使用 qianghaohao #incl...

weixin_30362801的博客 611

C++.Net中使用正则表达式的必备文件与实践指南

C++/CLI(C++ Component Language Infrastructure)是微软开发的一种编程语言,它是C++语言的一个扩展,主要目的是为了在.NET平台上更加便捷地创建托管代码。与传统的C++不同,C++/CLI能够创建和操作.NET Framework中的类型,例如类、接口和委托等。是.NET Framework的核心组件之一,它包含了.NET应用程序运行所需的基础类库。此动态链接库(DLL)定义了基本的数据类型如整数、字符串和数组,以及异常处理和垃圾收集机制等关键功能。

weixin_29138345的博客 1076

C++ Boost库正则表达式实战应用

本文还有配套的精品资源,点击获取 简介:C++ Boost库提供了一系列高效的库函数,其中Boost.Regex模块是处理字符串模式匹配的强大工具。本文深入讲解了Boost.Regex的核心功能与实际应用,涵盖了匹配模式创建、匹配操作、迭代器匹配、捕获组、替换操作以及修饰符的使用。通过介绍如何在C++中使用这些功能,本文帮助开发者高效处理文本数据,无论是简单的查找替换还是复...

weixin_35982453的博客 1902

C++的正则表达式

C++的正则表达式正则表达式的结构//regex_match匹配和regex_search//查询到的具体的信息smatch//查找的逐步查找//token,拆分//replace 替代//regex的常量 备注:参考书籍《C++标准库(第二版)》 正则表达式的结构 需要的头文件 #include <regex> // //regex_match匹配和regex_search void out(bool b) { cout << (b ? "found" : "not fou

simple_core的博客 4995

解决fetch_california_housing数据集403错误的三种实用方法

本文针对机器学习初学者加载fetch_california_housing数据集时常见的HTTPError 403: Forbidden错误,提供了三种经过实测的解决方案。详细介绍了手动下载与本地替换、修改源码下载路径以及配置网络访问策略的具体步骤,帮助用户根据自身网络环境和开发场景选择最佳方法,确保数据集顺利加载。

weixin_29074295的博客 550

C++ 正则表达式-基础操作

正则表达式是一个非常强大的工具,主要用于字符串匹配。如何在c++中使用正则表达式?下面就简要介绍一下c++中正则表达式相关函数的用法。 本篇博客中所涉及到的函数及其功能如下表所示: 函数 功能 regex_match(s,re) 目标字符串s和正则表达式re是否完全匹配 regex_search(s,match_result,re) 目标字符串s是否存在某个子串...

★匆匆★的专栏 376

深度学习中的编码器-解码器架构

解码的作用:转换为人类可理解的形式,解码器的任务是将编码器生成的中间表示(上下文向量)转换回人类可理解的输出形式(如翻译后的文本、生成的图像描述等)。解码器通过逐步生成输出序列,使得最终的输出符合人类的理解和需求。编码的作用:转换为机器可理解的形式,编码器将输入数据(如文本、图像等)转换为一种机器更容易处理和理解的形式,即上下文向量或编码。在深度学习中,编码器(Encoder)解码器(Decoder)是常见的神经网络架构,通常用于处理序列到序列(seq2seq)任务,如机器翻译、文本摘要和图像描述等。

xxk1323的博客 1093

CoppeliaSim学习笔记(1):建立Python脚本与CoppeliaSim的连接

CoppeliaSim学习笔记,建立python和CoppeliaSim的连接,实现联调。

qq_22487889的博客 1万+

24 C++ 正则表达式

本文介绍了C++正则表达式的核心组件和使用方法。主要内容包括:1) 核心组件std::regex、匹配结果类和匹配标志;2) 三大匹配操作函数regex_match、regex_search和regex_replace的功能与用法;3) 基础字符匹配技巧,包括精确匹配、转义特殊字符、通配符和字符集合;4) 重复匹配的量词规则。通过代码示例演示了各种匹配场景的实际应用,如数字验证、字符集匹配和量词控制等。文章还特别说明了原始字符串字面量的使用优势。

17208955的博客 1188

ASP.NET MVC5 C# Entity Framework 连接 Oracle 数据库

ASP.NET MVC5 C# Entity Framework 连接 Oracle 数据库创建数据库安装 Entity Framework配置数据库连接字符串添加实体模型类添加数据库上下文类添加控制器类运行测试 创建数据库 创建【全局数据库名】为 demodb 的Oracle数据库,用 SYSTEM 用户连接成功后创建【用户名】为 DJIANG 的用户,并授予该用户 DBA 角色 安装 Enti...

idjiang的博客 2537

C++字符串与正则表达式的融合实践

使用<regex>库进行基本匹配时,主要用到std::regex和std::regex_match函数。std::regex用于定义正则表达式对象,std::regex_match用于判断整个字符串是否与正则表达式匹配。在这段代码中,^Hello,.*$表示匹配以Hello,开头,后面可以是任意字符(包括空字符),并...• []:字符集合,匹配方括号内的任意一个字符。如ab+,可以匹配ab、abb等,但不匹配a。如^Hello,表示匹配以Hello开头的字符串。如ab*,可以匹配a、ab、abb等。

wengang345的博客 282

基于学术研究风云卫星数据下载教程

目录 一、相关网址 1.登录注册网址:国家卫星气象中心 2.风云数据服务客户端下载网址 3.风云卫星遥感数据服务网址 二、下载数据步骤 1.首先在注册登录网址,注册一个账户 2.待账户审核后,登录账户即可搜索并下载数据 三、相关工具下载 1.登录风云卫星遥感数据服务网址 2.NCSA HDFView软件 3.风云卫星数据(L1)处理软件包(FENGYUN Toolkit v1.1) 4.静止卫星云图分区图显示软件(SECView) 5.风云二号静止气象卫星数据及产品处理..

珞瑜的博客 1万+

数据库常见面试题(附答案)

1.事务四大特性 原子性,要么执行,要么不执行 隔离性,所有操作全部执行完以前,其它会话不能看到过程 一致性,事务前后,数据总额一致 持久性,一旦事务提交,对数据的改变就是永久的 2.数据库隔离级别,每个级别会引发什么问题,mysql默认是哪个级别 脏读:事务B读取事务A还没有提交的数据 不可重复读:两次事务读的数据不一致 幻读:事务A修改了数据,事务B也修改了数据,这时在事务A看...

csdn问鼎 46万+

C++11 正则表达式详解

本文详尽描述了C++11中正则表达式的使用方法

_Santiago的博客 3032

复现论文《孤岛微电网环境下基于物理模型引导的深度强化学习VSG频率控制方法》

本文提出了一种结合物理模型与深度强化学习的孤岛微电网VSG频率控制方法。通过建立VSG小信号模型并设计可变系数控制器,将物理知识融入深度强化学习框架,解决了高维参数和机组耦合带来的控制难题。复现代码实现了三个核心组件:VSGSmallSignalModel建模VSG动态特性,VariableCoefficientController实现参数自适应调节,PhysicsGuidedDRL整合DQN算法与物理模型引导的奖励机制。该方法通过模型驱动与数据驱动的优势互补,提升了频率控制性能,其中物理模型既作为先验知识

huanghm88的专栏 127

24. 正则表达式

正则表达式(regular expression)又称,是一种文本模式(pattern)。正则表达式使用一个字符串来描述、匹配具有相同规格的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式的核心功能就是处理文本。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。C++ 标准库从 C++ 11 开始提供了正则表达式(Regular Expressions)的支持,通过<regex>头文件来实现。

flurry_heart的博客 1317

RGB渐变颜色转换公式及例程

设Step=51,将RGB(255,0,0)颜色渐变为RGB(0,255,0),即RGB(255,0,0)经过51次颜色渐变转为RGB(0,255,0);设Step=51,将RGB(0,255,0)颜色渐变为RGB(0,0,255),即RGB(0,255,0)经过51次颜色渐变转为RGB(0,0,255);设Step=51,将RGB(0,0,255)颜色渐变为RGB(255,0,0),即RGB(0,0,255)经过51次颜色渐变转为RGB(255,0,0);分步骤的方式,使其渐变色循环整个颜色值;

1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++ 正则表达式分组捕获入门指南

正则表达式的分组捕获是一个非常强大的工具,它能够让你轻松提取和操作字符串中的特定部分。C++ 中的<regex>库提供了灵活的接口,允许你使用正则表达式进行模式匹配、捕获分组、查找多个匹配项以及进行替换操作。通过本文的示例代码,希望你能掌握 C++ 中正则表达式分组捕获的基础应用,并能在实际项目中灵活使用正则表达式来处理文本数据。

学习,你不是一个人在战斗 ~ 961302305(QQ,微信) 1097

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++正则表达式

正则表达式(regular expression)是计算机科学中的一个概念,又称规则表达式,通常简写为regex、regexp、RE、regexps、regexes、regexen。          正则表达式是一种文本模式。正则表达式是强大、便捷、高效的文本处理工具。正则表达式本身,加上如同一门袖珍编程语言的通用模式表示法(general pattern notation),赋予使用者描述和

shikelang_pp的博客 692

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: CCF 201712-4 试题名称: 行车路线
下一篇: CCF 201509-3 模板生成系统-正则表达式
philpanic9
博客等级 码龄9年 44粉丝 103原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值