C++正则表达式(匹配、搜索、替换)

16 篇文章 0 订阅

C++正则表达式(匹配、搜索、替换)
C++ regex C++11
Vs2019 编写

具有特殊意义的元字符
\:\字符能够改变字符原本的含义

字符指示字符串的头,且要求字符串以字符开头,不占位。^表示一个真正的^符号。

: : 字符指示字符串的尾,且要求字符串以字符结尾,不占位。$表示一个真正的$符号。

、():分组,大正则中包含小正则。可以改变默认的优先级。在模式中可以使用\1来表示第一组已然捕获到的东西。

\b:指示字符串的边界(头/尾/空格左/空格右),字符\b要求边界的左边是字符,\b字符要求边界的右边是字符。

.:表示一个除了\n以外的任意一个字符。.表示一个真正的.符号。

|:字符串1|字符串2表示一个字符串,该字符串是字符串1、字符串2中的一个。|在正则中的优先级比较混乱,所以建议加上足够多的括号来分组。

[]:[字符1字符2字符3…]表示一个字符,该字符是字符1、字符2、字符3……中的某一个。中括号中出现的所有字符都是代表本身意思的字符(没有特殊含义),如[.]只能匹配.符号,而不能匹配任意符号。

[^字符1字符2字符3…]表示一个字符,该字符不是字符1、字符2、字符3……中的任何一个

[a-z]表示一个字符,该字符是a、b、c……z中的某一个

[^a-z]表示一个字符,该字符不是a、b、c……z中的任何一个

\w:表示一个字符,该字符是数字、字母、下划线中的某一个。等价于[(0-9)(a-z)(A-Z)(_)]

\W:表示一个字符,该字符不是数字、字母、下划线中的任何一个。等价于[]

\d表示一个字符,该字符是0、1、2……9中的某一个

\D表示一个字符,该字符不是0、1、2……9中的任何一个

\s表示一个字符,该字符是空白符(空格、制表符、换页符)2、代表出现次数的

量词元字符
:字符要求字符出现0到多次

+:字符+要求字符出现1到多次

?:字符?要求字符出现0次或1次

{n}:字符{n}要求字符出现n次

{n,}:字符{n,}要求字符出现n到多次

{n,m}:字符{n,m}要求字符出现n到m次。

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

// 正则匹配
void RegexMatch(string source_string, regex regex_string)
{
	

	if (regex_match(source_string, regex_string))
	{
		cout << " regex " << source_string << endl;
	}
	else
	{
		cout << " not regex " << source_string << endl;
	}
}

// 正则匹配并保存结果
void RegexMatch(string source_string, regex regex_string, smatch& result)
{
	if (regex_match(source_string.cbegin(),source_string.cend(),result,regex_string))
	{
		cout << " regex: " << result.str() << endl;;
	}
	else
	{
		cout << " not regex " << endl;
	}
}

// 正则搜索
void RegexSearch(string source_string, regex regex_string, smatch& result)
{
	if (regex_search(source_string, result, regex_string))
	{
		cout << result.str() << endl;
	} 
	else
	{
		cout << "no regex" << endl;
	}
	
}

// 正则迭代器搜索
void RegexSearchIterator(string source_string, regex regex_string, smatch& result)
{
	sregex_iterator start(source_string.cbegin(), source_string.cend(), regex_string);
	sregex_iterator end;

	for (auto it = start; it != end; it++)
	{
		result = *it;
		cout << result.str() << endl;
		cout << "result size: " << result.size() << endl;
		cout << "sub regex:" << result.str(1) << endl;
	}

}


// 正则替换
void RegexReplace(string source_string, string replace_string, regex regex_string, string& result)
{
	result = regex_replace(source_string, regex_string, replace_string);
	cout << "after replace: " << result << endl;
}


int main(int argc, char** argv)
{
	// 次数:+表示一次或多次,?表示0次或1次, *表示0次或多次
    // {n}表示n次,{n,}表示n次或多次,{n,m}表示n到m次
	// ()里表示子正则

	// 匹配数字用\d+ 、\d*
	string digital_string = "123456789";       // 字符串
	regex regexNumber1(R"(\d*)");              // 正则表达式,R表示去掉转义
	RegexMatch(digital_string, regexNumber1);

	regex regexNumber2(R"(\d+)");              // 正则表达式,R表示去掉转义
	RegexMatch(digital_string, regexNumber2);

	// 匹配字母。
	string character_string = "abcdEfsGHHdsasaskkKKKKss";
	regex  regex26Character("[a-zA-Z]+");       // 匹配26个英文字母
	RegexMatch(character_string, regex26Character);

	// 匹配数字字母组合
	string digital_character_string = "1234abcE45678GHHdabc123456aadddsss1457";
	regex  regexDigitalCharacter("[1-4]+[a-zA-Z]{4}[4-8]+[a-zA-Z]{4}");  // 匹配字母数组组合
	RegexMatch(digital_character_string, regexDigitalCharacter);


	// 将匹配结果输出
	regex regex_digital(R"(\d+)");
	smatch result;
	RegexMatch(digital_string, regex_digital, result);

	// 正则搜索
	RegexSearch(digital_character_string, regex_digital, result);


	// 正则搜索 
	regex regex_complex(R"(abc\w+?d)"); // 搜索abcE45678GHHd // ?关闭贪婪模式
	RegexSearch(digital_character_string, regex_complex, result);
	
	RegexSearchIterator(digital_character_string, regex_digital, result); // 搜索输出数字

	string digital_character_string2 = "Aabc123efgaffffggggabc456efgacccccccabc789efg";
	regex regex_complex2(R"(abc(\d+)efg)");
	RegexSearchIterator(digital_character_string2, regex_complex2, result); // abc数字efg


	// 正则替换
	string output_string;
	regex replace_regex(R"([a-z])"); // 所有的英文字母
	regex replace_regex_icase(R"([a-z])",regex::icase); // 所有的英文字母,icase表示忽略大小写
	string replace_string = ""; // 替换为空,替换时是每个字符的匹配
	RegexReplace(digital_character_string2, replace_string, replace_regex, output_string);
	RegexReplace(digital_character_string2, replace_string, replace_regex_icase, output_string);
	return 0;
}
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
C正则表达式是一种用于匹配搜索替换文本的工具。它可以通过一些特定的语法规则来描述一些文本模式,然后在文本中查找符合这些模式的内容。 在C标准库中的regex类可以用于实现正则表达式的功能。你可以使用regex类的成员函数来进行匹配搜索替换操作。 例如,你可以使用regex_match函数来判断一个字符串是否与指定的正则表达式匹配,使用regex_search函数来搜索文本中符合指定正则表达式的内容,使用regex_replace函数来替换文本中符合指定正则表达式的内容。 此外,你还可以使用一些特定的正则表达式语法来描述不同的文本模式,例如使用"."表示匹配任意字符,使用"*"表示匹配前面的字符零次或多次,使用"+"表示匹配前面的字符一次或多次,使用"[]"来表示匹配其中的任意一个字符,使用"{}"来表示匹配前面的字符一定次数等等。 使用C标准库中的regex类,你可以方便地进行正则表达式的操作,以满足你对文本匹配搜索替换的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++ 正则表达式](https://blog.csdn.net/cat_fish_rain/article/details/130780540)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神奇的小强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值