-
C++正则表达式去除html标签
这篇文章总结了一下C++的正则表达式库的使用方法。如有错漏,敬请指正!
简介
C++11通过库函数的形式提供了对正则表达式的处理支持,头文件是#include <regex>。这里有点要注意的是,gcc4.8在标准库里占了个坑,但是并没有在标准库中实现正则表达式,一旦运行标准库中的正则表达式就会抛出异常。gcc4.9才在标准库中实现了正则表达式。C++11引入的正则表达式库来自于Boost库的正则表达式库。实际上,这两个库提供的算法、类型,除了命名空间不一样,其它都是一样的。
关于正则表达式的学习,可以参考这篇文章。
关于正则表达式的处理。Boost提供可三个算法:
判断整个字符串是否与正则表达式匹配:boost::regex_match()
在字符串中搜索与正则表达式匹配的子串:boost::regex_search()
替换掉字符串中所有与正则表达式匹配的字串:boost::regex_replace()
正则表达式使用boost::regex来表示。
正则表达式的匹配的子串结果使用boost::smatch和boost::sub_match来表示。
例子
下面通过例子和注释简单说明其用法。
#include <boost/regex.hpp>
#include <iostream>
#include <string>
using namespace std;
int main()
{
boost::regex rgx("(\\w+)\\s(\\w+)");
string s("abcd efgh");
/* boost::regex_match() 当字符串和正则表达式<完全匹配>的时候返回true,否则返回false。
* */
cout << boost::regex_match(s, rgx) << endl;
cout << "========分割线========" << endl;
/* boost::regex_search() 找到第一个和正则表达式匹配的子串则返回true,具体匹配子串的信息存放在
* boost::smatch类型的参数里。否则返回false。
*
* boost::smatch实际上是持有boost::sub_match的元素的容器。
*
* boost::sub_match继承自类std::pair,对应的匹配子串由first和second成员表示:[first, second)。
* */
boost::smatch result;
if (boost::regex_search(s, result, rgx))
{
for (size_t i = 0; i < result.size(); ++i)
{
//result[0] 正则表达式的匹配结果。
//result[1] 第一个分组的匹配结果。
//result[2] 第二个分组的匹配结果。
cout << result[i] << endl;
}
}
cout << "========分割线========" << endl;
rgx = "(\\w+)\\s\\w+";
if (boost::regex_search(s, result, rgx))
{
for (size_t i = 0; i < result.size(); ++i)
{
//result[0] 正则表达式的匹配结果
//result[1] 分组的匹配结果
cout << result[i] << endl;
}
}
cout << "========分割线========" << endl;
rgx = "\\w+\\s(\\w+)";
if (boost::regex_search(s, result, rgx))
{
for (size_t i = 0; i < result.size(); ++i)
{
cout << result[i] << endl;
}
}
cout << "========分割线========" << endl;
rgx = "\\w+\\s\\w+";
if (boost::regex_search(s, result, rgx))
{
for (size_t i = 0; i < result.size(); ++i)
{
cout << result[i] << endl;
}
}
cout << "========分割线========" << endl;
rgx = "(\\d+)\\s(\\w+)";
if (boost::regex_search(s, result, rgx))
{
for (size_t i = 0; i < result.size(); ++i)
{
cout << result[i] << endl;
}
}
cout << "========分割线========" << endl;
/* 遍历正则匹配整个字符串。
*/
s = "abcd efgh ijk www";
rgx = "\\w+\\s\\w+";
auto begin = s.cbegin();
auto end = s.cend();
while (boost::regex_search(begin, end, result, rgx))
{
cout << result[0] << endl;
begin = result[0].second;
}
cout << "========分割线========" << endl;
/*
* boost::regex_replace() 替换掉字符串中<所有>匹配的子串。
*/
//结果输出到一个Output Iterator。
boost::regex_replace(std::ostreambuf_iterator<char>(std::cout), s.cbegin(), s.cend(), rgx, "666666");
cout << endl;
//直接返回结果
cout << boost::regex_replace(s, rgx, "2233333") << endl; //每一个匹配
}
简介
C++11通过库函数的形式提供了对正则表达式的处理支持,头文件是#include <regex>。这里有点要注意的是,gcc4.8在标准库里占了个坑,但是并没有在标准库中实现正则表达式,一旦运行标准库中的正则表达式就会抛出异常。gcc4.9才在标准库中实现了正则表达式。C++11引入的正则表达式库来自于Boost库的正则表达式库。实际上,这两个库提供的算法、类型,除了命名空间不一样,其它都是一样的。
关于正则表达式的学习,可以参考这篇文章。
关于正则表达式的处理。Boost提供可三个算法:
判断整个字符串是否与正则表达式匹配:boost::regex_match()
在字符串中搜索与正则表达式匹配的子串:boost::regex_search()
替换掉字符串中所有与正则表达式匹配的字串:boost::regex_replace()
正则表达式使用boost::regex来表示。
正则表达式的匹配的子串结果使用boost::smatch和boost::sub_match来表示。
例子
下面通过例子和注释简单说明其用法。
#include <boost/regex.hpp>
#include <iostream>
#include <string>
using namespace std;
int main()
{
boost::regex rgx("(\\w+)\\s(\\w+)");
string s("abcd efgh");
/* boost::regex_match() 当字符串和正则表达式<完全匹配>的时候返回true,否则返回false。
* */
cout << boost::regex_match(s, rgx) << endl;
cout << "========分割线========" << endl;
/* boost::regex_search() 找到第一个和正则表达式匹配的子串则返回true,具体匹配子串的信息存放在
* boost::smatch类型的参数里。否则返回false。
*
* boost::smatch实际上是持有boost::sub_match的元素的容器。
*
* boost::sub_match继承自类std::pair,对应的匹配子串由first和second成员表示:[first, second)。
* */
boost::smatch result;
if (boost::regex_search(s, result, rgx))
{
for (size_t i = 0; i < result.size(); ++i)
{
//result[0] 正则表达式的匹配结果。
//result[1] 第一个分组的匹配结果。
//result[2] 第二个分组的匹配结果。
cout << result[i] << endl;
}
}
cout << "========分割线========" << endl;
rgx = "(\\w+)\\s\\w+";
if (boost::regex_search(s, result, rgx))
{
for (size_t i = 0; i < result.size(); ++i)
{
//result[0] 正则表达式的匹配结果
//result[1] 分组的匹配结果
cout << result[i] << endl;
}
}
cout << "========分割线========" << endl;
rgx = "\\w+\\s(\\w+)";
if (boost::regex_search(s, result, rgx))
{
for (size_t i = 0; i < result.size(); ++i)
{
cout << result[i] << endl;
}
}
cout << "========分割线========" << endl;
rgx = "\\w+\\s\\w+";
if (boost::regex_search(s, result, rgx))
{
for (size_t i = 0; i < result.size(); ++i)
{
cout << result[i] << endl;
}
}
cout << "========分割线========" << endl;
rgx = "(\\d+)\\s(\\w+)";
if (boost::regex_search(s, result, rgx))
{
for (size_t i = 0; i < result.size(); ++i)
{
cout << result[i] << endl;
}
}
cout << "========分割线========" << endl;
/* 遍历正则匹配整个字符串。
*/
s = "abcd efgh ijk www";
rgx = "\\w+\\s\\w+";
auto begin = s.cbegin();
auto end = s.cend();
while (boost::regex_search(begin, end, result, rgx))
{
cout << result[0] << endl;
begin = result[0].second;
}
cout << "========分割线========" << endl;
/*
* boost::regex_replace() 替换掉字符串中<所有>匹配的子串。
*/
//结果输出到一个Output Iterator。
boost::regex_replace(std::ostreambuf_iterator<char>(std::cout), s.cbegin(), s.cend(), rgx, "666666");
cout << endl;
//直接返回结果
cout << boost::regex_replace(s, rgx, "2233333") << endl; //每一个匹配
}