C++ regex库的三种正则表达式操作

关于正则表达式的语法和字符含义,网上已经有很不错的博客教学,我当初参考的是

读懂正则表达式就这么简单 - Zery - 博客(http://www.cnblogs.com/zery/p/3438845.html

正则表达式 – 语法 | 菜鸟教程  (http://www.runoob.com/regexp/regexp-syntax.html)

我在这里重点说明如何使用C++的regex库完成正则匹配,正则查找,正则替换三种操作

  1. 首先是头文件
     #include<regex>
    using namespace std;
  2. 正则表达式声明
    string str("\\d{4}");
    regex pattern(str,regex::icase);

    注意与一般应用正则表达式不同,这里的转义符号要用“\\”

  3. 匹配结果存放变量声明
         //第一种存储方式
    match_results<string::const_iterator> result;
    //第二种存储方式
    smatch result;

    这两个类都可以存储匹配得到的结果,建议使用第二种,比较方便

  4. 数据准备
         //文本数据
    string str="1994 is my birth year";
  5. 正则操作
    • 正则匹配
           //正则匹配
      string regex_str2("(\\d{4}).*");
      regex pattern2(regex_str2,regex::icase); if(regex_match(str,result,pattern2)){
      cout<<result[]<<endl;
      cout<<result[]<<endl;
      }

      注意正则匹配的运算规则是先检查正则表达式是否与文本数据一致,只有在一致的条件下才会将匹配结果送入result中。例如将正则表达式改为("\\d{4}"),返回值为FALSE,result中根本没有结果。下图是运行结果。我们从中看出result[0]是完整的文本,result[1]是第一个分组匹配的数据。如果正则表达式有n个分组,result的size也就是n+1个

       

C++ regex库的三种正则表达式操作

    • 正则查找
           //文本数据
      string str="1994 is my birth year";
      //正则表达式
      string regex_str("\\d{4}");
      regex pattern1(regex_str,regex::icase); //迭代器声明
      string::const_iterator iter = str.begin();
      string::const_iterator iterEnd= str.end();
      string temp;
      //正则查找
      while (std::regex_search(iter,iterEnd,result,pattern1))
      {
      temp=result[];
      cout<<temp<<endl;
      iter = result[].second; //更新搜索起始位置
      }

      首先声明迭代器,在用while循环查找,每一次查找只会匹配一个结果

    • 正则替换
      //正则替换
      std::regex reg1("\\d{4}");
      string t("");
      str = regex_replace(str,reg1,t); //trim_left
      cout<<str<<endl;

      在str查找匹配的文本,并用t中的数据替换。经检验,这个函数会遍历整个文本变量,也就是文本变量中所有符合正则表达式的数据都会被替换

以上就是我的经验总结,希望能帮到你。

最后附上所有代码

 int main(){

     //第一种存储方式
//match_results<string::const_iterator> result;
//第二种存储方式
smatch result; //文本数据
string str="1994 is my birth year 1994";
//正则表达式
string regex_str("\\d{4}");
regex pattern1(regex_str,regex::icase); //迭代器声明
string::const_iterator iter = str.begin();
string::const_iterator iterEnd= str.end();
string temp;
//正则查找
while (std::regex_search(iter,iterEnd,result,pattern1))
{
temp=result[];
cout<<temp<<endl;
iter = result[].second; //更新搜索起始位置
} //正则匹配
string regex_str2("(\\d{4}).*");
regex pattern2(regex_str2,regex::icase); if(regex_match(str,result,pattern2)){
cout<<result[]<<endl;
cout<<result[]<<endl;
} //正则替换
std::regex reg1("\\d{4}");
string t("");
str = regex_replace(str,reg1,t); //trim_left
cout<<str<<endl; return ;
}
上一篇:iOS --转载2018苹果$299美元企业级开发者账号申请攻略


下一篇:BZOJ 1385: [Baltic2000]Division expression