Bootstrap

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

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;
}
;