c++正则表达式

正则表达式需要头文件 #include< regex >

1、匹配

bool regex_match(string s,regex pattern)
bool regex_match(string s,smatch result,regex pattern)
bool regex_match(s.cbegin()+i,s.cend(),smatch result,regex pattern)  //从字符串的某个位置开始匹配

匹配函数只有当模式匹配了整个字符串(或从给定位置开始的字符串),才会返回true。

如果需要保存结果,可以用第二种函数,用smatch result保存结果。
通常result[0]保存整个匹配结果,result[i]保存第i个捕获组的匹配结果,即模式中第i个括号的匹配结果。如果没有这样的结果则为空。
可以用result.size()查看一共有多少个匹配结果。

#include<iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<vector>
#include<map>
#include<algorithm>
#include<regex>
using namespace std;







int main()
{
	regex pattern("([a-zA-Z]{3})_(\\d{4})");
	string s = "sMQ_1998";
	smatch result;
	bool ismatch = regex_match(s, result, pattern);
	if (ismatch)
	{
		cout << "匹配成功:" << result[0] << endl;
		cout << "result.size():" << result.size() << endl;
		for (int i = 1; i < result.size(); i++)
			cout << result[i] << endl;
	}
	else
		cout << "匹配失败" << endl;

	string ss = "1k7zyy_1997";
	bool ismatch2 = regex_match(ss.cbegin() + 3, ss.cend(), result, pattern);  //从第4个字符处开始匹配
	if (ismatch2)
	{
		cout << "匹配成功:" << result[0] << endl;
		cout << "result.size():" << result.size() << endl;
		for (int i = 1; i < result.size(); i++)
			cout << result[i]  << endl;
	}
	else
		cout << "匹配失败" << endl;

	return 0;
}
//out
匹配成功:sMQ_1998
result.size():3
sMQ
1998
匹配成功:zyy_1997
result.size():3
zyy
1997

2、查找

bool regex_search(string s,regex pattern)
bool regex_search(string s,smatch result,regex pattern)
bool regex_search(s.cbegin()+i,s.cend(),smatch result,regex pattern)  //从字符串的某个位置开始匹配

搜索给定字符串中是否存在与模式匹配的子串,如果存在则返回true。

同样可以用smatch result记录结果,但不同的是result[0]记录的是整个字符串中从左往右第一个匹配模式的子串。

假如有多个子串符合模式,若想知道result[0]中存储的是第几个子串,可以用result.position()函数,返回数从0开始。

!!!
如果想遍历整个源串,一一匹配所有符合模式的子串,可以用string的迭代器,用resul.second()更新迭代器位置,具体如下
这里注意,smatch[0].first返回的是查找结果子串的在源串中的迭代器位置,second返回的是子串后面的位置。

3、替换

string regex_replace(string s,regex p,string replace_str)
//有其他重载用法

在这里插入图片描述

int main()
{
	regex pattern("[a-zA-Z]{3}");
	string s = "32sMQ_19988abc_199912", ss;
	ss = regex_replace(s, pattern, "-ops-");
	cout << ss << endl;

	ss = regex_replace(s, pattern, "-ops$$-");
	cout << ss << endl;

	ss = regex_replace(s, pattern, "-ops$&-");  //$&表示整个匹配子串
	cout << ss << endl;

	ss = regex_replace(s, pattern, "-ops$`-");  //$`表示源串中整个匹配子串左侧内容(从上一个匹配子串右侧到自己左侧)
	cout << ss << endl;

	ss = regex_replace(s, pattern, "-ops$'-");  //$`表示源串中整个匹配子串右侧内容 (整个右侧内容)
	cout << ss << endl << endl;

	regex pattern2("([a-zA-z]{3})_(\\d{4})");  
	ss = regex_replace(s, pattern2, "$1"); //只要前面的字母部分
	cout << ss << endl;
	ss = regex_replace(s, pattern2, "$2");  //只要后面的数字部分
	cout << ss << endl;
	ss = regex_replace(s, pattern2, "");  
	cout << ss << endl;
	ss = regex_replace(s, pattern2, "$3_$2");  //利用$n调整顺序
	cout << ss << endl;
	return 0;
}
//out
32-ops-_19988-ops-_199912
32-ops$-_19988-ops$-_199912
32-opssMQ-_19988-opsabc-_199912
32-ops32-_19988-ops_19988-_199912
32-ops_19988abc_199912-_19988-ops_199912-_199912

32sMQ8abc12
3219988199912
32812
32_19988_199912
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值