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