#include <regex>
void t_regular_expression()
{
//regex_match要求整个字符串匹配上才返回 true
std::string str_regex = "([1-9]\\d{3})-(0\\d|1[012])-([01]\\d|2[0-9]|3[01])";
regex reg{str_regex};
std::vector<std::string> date_vec{"2019-01-01",
"2019-12-31",
"2019-05-06",
"20111-05-12",
"2011-005-23",
"2011-05-333",
"2015-5-6",
"hello 2023-03-03!"};
auto t_regex_match = [reg, date_vec](){
std::cout << "test for regex_match" << std::endl;
for(std::string date_str : date_vec)
{
if(smatch match_result; regex_match(date_str, match_result, reg))
{
std::cout << date_str << " matched" << std::endl;
std::cout << "matched size: " << match_result.size() << std::endl;
std::cout << match_result.str(0) << " : " << match_result.str(1) << "-" << match_result.str(2) << "-" << match_result.str(3) << std::endl;
//也可以这样获得捕获的字符串 依次是: 匹配的整个字符串, 第1个匹配, 第2个匹配 ......
for(auto mr : match_result)
{
std::cout << mr <<std::endl;
}
std::cout << std::endl;
}
else
{
std::cout << date_str << " not match" << std::endl;
}
}};
t_regex_match();
//regex_search匹配子串
auto t_regex_search = [reg, date_vec](){
std::cout << "test for regex_search" << std::endl;
for(std::string date_str : date_vec)
{
if(smatch match_result; regex_search(date_str, match_result, reg))
{
std::cout << date_str << " matched" << std::endl;
std::cout << "matched size: " << match_result.size() << std::endl;
std::cout << match_result.str(0) << " : " << match_result.str(1) << "-" << match_result.str(2) << "-" << match_result.str(3) << std::endl;
//也可以这样获得捕获的字符串 依次是: 匹配的整个字符串, 第1个匹配, 第2个匹配 ......
for(auto mr : match_result)
{
std::cout << mr <<std::endl;
}
std::cout << std::endl;
}
else
{
std::cout << date_str << " not match" << std::endl;
}
}
};
t_regex_search();
auto t_search_backreference = [](){
std::cout << "test for regex_search backreferance" << std::endl;
std::string target = "2001 is not a symmetrical year, 2002 is a symmetrical year!";
auto search = [](std::string target, std::regex reg){
if(smatch match_result; std::regex_search(target, match_result, reg))
{
std::cout << "matched a symmetrical year: " << match_result.str(0) <<std::endl;
std::cout << "match_result: " << match_result.size() << std::endl;
}
else
{
std::cout << "not matched" <<std::endl;
}};
std::regex reg2("(\\d)(\\d)\\2\\1");
search(target, reg2);
};
t_search_backreference();
auto t_regex_iterator = [reg](){
std::cout << "test for sregex_iterator" << std::endl;
std::string date_string ="2019-01-01" "2019-12-31" "2019-05-06" "20111-05-12" "2011-005-23" "2011-05-333" "2015-5-6" "hello 2023-03-03!";
const sregex_iterator end;//这个要写上,通过默认构造函数构造一个尾迭代器
//注意
for(sregex_iterator iter{cbegin(date_string), cend(date_string), reg}; iter != end; ++iter)
{
std::smatch match = *iter;
std::cout << "match size: " <<match.size() << std::endl;
std::string matched_str = match.str(0);
std::cout << "matched string: " << matched_str << std::endl;
std::string matched_str_year = match.str(1);
std::cout << "year: " << matched_str_year << std::endl;
std::string matched_str_month = match.str(2);
std::cout << "month: " << matched_str_month << std::endl;
std::string matched_str_day = match.str(3);
std::cout << "day: " << matched_str_day << std::endl;
}
};
t_regex_iterator();
auto t_regex_token_iterator = [reg](){
std::cout << "test for sregex_token_iterator" << std::endl;
std::string date_string ="2019-01-01" "2019-12-31" "2019-05-06" "20111-05-12" "2011-005-23" "2011-05-333" "2015-5-6" "hello 2023-03-03!";
const sregex_iterator end;//这个要写上,通过默认构造函数构造一个尾迭代器
//注意
for(sregex_iterator iter{cbegin(date_string), cend(date_string), reg}; iter != end; ++iter)
{
std::smatch match = *iter;
std::cout << "match size: " <<match.size() << std::endl;
std::string matched_str = match.str(0);
std::cout << "matched string: " << matched_str << std::endl;
std::string matched_str_year = match.str(1);
std::cout << "year: " << matched_str_year << std::endl;
std::string matched_str_month = match.str(2);
std::cout << "month: " << matched_str_month << std::endl;
std::string matched_str_day = match.str(3);
std::cout << "day: " << matched_str_day << std::endl;
}
};
t_regex_token_iterator();
auto t_regex_token_iterator_act_as_tokenizer = [](){
regex reg { R"(\s*[,;]\s*)" };
string str_to_tokenize{"This is from xian,, it's a nice; day!"};
const sregex_token_iterator end;
for (sregex_token_iterator iter { cbegin(str_to_tokenize), cend(str_to_tokenize), reg, -1}; iter != end; ++iter) {
cout << iter->str() << endl;
}
};
t_regex_token_iterator_act_as_tokenizer();
auto t_regex_replace = [](){
const string str_to_match{"<body><h1>Header</h1><p>Some text</p></body>"};
regex reg{"<h1>(.*)</h1><p>(.*)</p>"};
const string str_replacement{"H1=$1, P=$2"};
string result_format_default{regex_replace(str_to_match, reg, str_replacement, regex_constants::format_default)};
string result_format_no_copy{regex_replace(str_to_match, reg, str_replacement, regex_constants::format_no_copy)};
string result_format_first_only{regex_replace(str_to_match, reg, str_replacement, regex_constants::format_first_only)};
std::cout << "str_to_match: " << str_to_match << std::endl;
std::cout << "format_default: " << result_format_default << std::endl;
std::cout << "format_no_copy: " << result_format_no_copy << std::endl;
std::cout << "format_first_only: " << result_format_first_only << std::endl;
};
t_regex_replace();
}
标准C++正则表达式使用示例
最新推荐文章于 2025-03-05 17:19:26 发布