正则表达式

当前位置:正则表达式 > c++

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;    //每一个匹配
  
  
   
}
  
 

相关文章
苏ICP备2022026517号-2  |   苏公网安备 32081202000316号
淮安先皓网络科技有限公司 © 版权所有  联系我们