一、简介:
- 本文主要是大致的介绍如何使用 C++ 标准库中 std::regex 相关类库
- 在使用 C++ 标准库正则表达式之前,肯定是要先学习正则表达式语法的,不解释。
- 要学习正则表达式语法,你百度一下,可以百度一把大。但是,我个人觉得写的最经典的莫过于这篇文章了 正则终极秘籍 ,感谢这篇文章作者 30 秒。我觉得只需要读懂这篇文章的 80%,你将感受到正则表达式处理字符串那毁天灭地的威力。
二、常用 C++ 标准库正则表达式类:
- C++ 标准库中常用正则表达式类主要包含如下 5 组:
- 有了以上 5 组模板,基本上可以处理所有的字符串处理需求了。
三、C++ 正则表达式模板的使用:
1)std::regex_match
- std::regex_match: 正则表达式需要匹配整个字符串序列,也就是说正则表达式要与字符串完全匹配。因此,它是单次匹配,否则匹配失败, 它还可以获取子匹配的组
- 范例代码如下:
void match()
{
/
std::string text = "Date:2017-10-10";
std::string pattern = "Date.(\\d{4})-(\\d{2}-(\\d{2}))";
std::regex express(pattern);
std::cout.setf(std::ios_base::boolalpha);
std::match_results<std::string::iterator> results1;
if(std::regex_match(text.begin(), text.end(), results1, express))
{
std::match_results<std::string::iterator>::const_iterator iter;
for (iter = results1.begin(); iter != results1.end(); iter++)
{
std::cout << iter->length() << ": " << iter->str() << std::endl;
}
}
std::smatch s_results1;
if(std::regex_match(text.cbegin(), text.cend(), s_results1, express))
{
std::match_results<std::string::const_iterator>::const_iterator iter;
for (iter = s_results1.begin(); iter != s_results1.end(); iter++)
{
std::cout << iter->length() << ": " << iter->str() << std::endl;
}
}
std::cout << std::regex_match(text.begin(), text.end(), express) << std::endl;
std::cmatch c_results3;
if(std::regex_match(text.c_str(), c_results3, express))
{
for (auto iter = c_results3.begin(); iter != c_results3.end(); iter++)
{
std::cout << iter->length() << ": " << iter->str() << std::endl;
}
}
std::cout << std::regex_match(text.c_str(), express) << std::endl;
std::match_results<std::string::const_iterator> s_results5;
if(std::regex_match(text, s_results5, express))
{
for (size_t index = 0; index < s_results5.size(); index++)
{
std::ssub_match sub = s_results5[index];
std::cout << sub.length() << ": " << sub.str() << std::endl;
}
}
std::cout << std::regex_match(text, express) << std::endl;
/
}
2)std::regex_search
- 搜素正则表达式参数,但它不要求整个字符序列完全匹配。而且它只进行单次搜索,搜索到即停止继续搜索,不进行重复多次搜索。
- 范例代码如下:
void search()
{
/
std::string text = "Date:2017-10-10 ~ 2017-10-15";
std::string pattern = "(\\d{4})-(\\d{2}-(\\d{2}))";
std::regex express(pattern);
std::cout.setf(std::ios_base::boolalpha);
std::match_results<std::string::iterator> results1;
if(std::regex_search(text.begin(), text.end(), results1, express))
{
std::match_results<std::string::iterator>::const_iterator iter;
for (iter = results1.begin(); iter != results1.end(); iter++)
{
std::cout << iter->length() << ": " << iter->str() << std::endl;
}
}
std::cout << std::regex_search(text.begin(), text.end(), express) << std::endl;
std::cmatch c_results3;
if(std::regex_search(text.c_str(), c_results3, express))
{
for (size_t index = 0; index < c_results3.size(); index++)
{
std::csub_match sub = c_results3[index];
std::cout << sub.length() << ": " << sub.str() << std::endl;
}
}
std::cout << std::regex_search(text.c_str(), express) << std::endl;
std::smatch s_results5;
if (std::regex_search(text, s_results5, express))
{
for (auto iter = s_results5.begin(); iter != s_results5.end(); iter++)
{
std::cout << iter->length() << ": " << iter->str() << std::endl;
}
}
std::cout << std::regex_search(text, express) << std::endl;
}
3)std::regex_replace
- std::regex_replace: 多次搜索整个正则表达式(不考虑捕获组),然后替换正则表达式匹配到的结果。
- 范例代码如下:
void replace()
{
/
std::string text = "Date:2017-10-10 ~ 2017-10-15";
std::string pattern = "(\\d{4})-(\\d{2}-(\\d{2}))";
std::regex express(pattern);
std::string result(256, '0');
std::string substitutes = "2017-10-12";
*std::regex_replace(result.begin(), text.begin(), text.end(), express, substitutes) = '\0';
std::cout << result.c_str() << std::endl;
result.clear();
result.resize(256, '0');
result = std::regex_replace(text, express, substitutes);
std::cout << result.c_str() << std::endl;
}
4)std::regex_iterator
- std::regex_iterator: 用于多次重复匹配,不分组,只进行多次匹配整个正则表达式,可获取整个正则表达式的结果。
- 范例代码如下:
void iterator()
{
/
std::string text = "Date:2017-10-10 ~ 2017-10-15";
std::string pattern = "(\\d{4})-(\\d{2}-(\\d{2}))";
std::regex express(pattern);
std::regex_iterator<std::string::const_iterator> begin(text.cbegin(), text.cend(), express);
for (auto iter = begin; iter != std::sregex_iterator(); iter++)
{
std::cout << iter->length() << ": " << iter->str() << std::endl;
}
}
5)std::regex_token_iterator
- std::regex_token_iterator: 用于多次匹配正则表达式, 它可以获取整个正则表达式的结果,也可以获取正则表达式的前缀,还可以获取正则表达式的分组子匹配。
- 范例代码如下:
void token_iterator()
{
/
std::string text = "Date:2017-10-10 ~ 2017-10-15";
std::string pattern = "(\\d{4})-(\\d{2}-(\\d{2}))";
std::regex express(pattern);
std::regex_token_iterator<std::string::const_iterator> begin2_1(text.cbegin(), text.cend(), express);
for (auto iter = begin2_1; iter != std::sregex_token_iterator(); iter++)
{
std::cout << iter->length() << ": " << iter->str() << std::endl;
}
std::regex_token_iterator<std::string::const_iterator> begin2_2(text.cbegin(), text.cend(), express, -1);
for (auto iter = begin2_2; iter != std::sregex_token_iterator(); iter++)
{
std::cout << iter->length() << ": " << iter->str() << std::endl;
}
std::regex_token_iterator<std::string::const_iterator> begin2_3(text.cbegin(), text.cend(), express, 3);
for (auto iter = begin2_3; iter != std::sregex_token_iterator(); iter++)
{
std::cout << iter->length() << ": " << iter->str() << std::endl;
}
std::vector<int> vec;
vec.push_back(-1);
vec.push_back(2);
std::regex_token_iterator<std::string::iterator> begin3(text.begin(), text.end(), express, vec);
for (auto iter = begin3; iter != std::regex_token_iterator<std::string::iterator>(); iter++)
{
std::cout << iter->length() << ": " << iter->str() << std::endl;
}
int arr[] = {-1, 0};
std::regex_token_iterator<std::string::iterator> begin4(text.begin(), text.end(), express, arr);
for (auto iter = begin4; iter != std::regex_token_iterator<std::string::iterator>(); iter++)
{
std::cout << iter->length() << ": " << iter->str() << std::endl;
}
}