zoukankan      html  css  js  c++  java
  • c++ 正则表达式

    话说c++11有正则了,在vs2010中有支持,在std里面就有,包含<regex>即可

    不过感觉没有c#里用的方便,而且没有@关键词写个正则得麻烦死

    声明正则用regex

    匹配结果用match_results<T>保存

      typedef match_results<const char *> cmatch;
      typedef match_results<const wchar_t *> wcmatch;
      typedef match_results<string::const_iterator> smatch;
      typedef match_results<wstring::const_iterator> wsmatch;

    匹配用regex_match,有多个重载版本,包括返回匹配结果,设置匹配参数等

      regex_match存储了匹配到的字符串

      regex_match[0]返回匹配到的字符串

      regex_match[n]依次匹配每个group

    替换用regex_replace,可以使用$n表示子表达式

    搜索用regex_search,regex_search不接受string作为参数,很反人类

    一些例子

    1 search

      string a1="aswha";
      regex r("as(.+)");  
      cmatch cm;
      bool b1=regex_search(a1.c_str(),cm,r);
      cout<<b1<<" "<<cm.size()<<endl;
      cout<<cm[0]<<endl;

      输出1 2 aswha wha

    2 replace 

      string a1="a ship a ship";
      regex r("a (\\w*)");
      string rep="an $1";
      cmatch cm;
      string str1=regex_replace(a1,r,rep);
      cout<<str1<<endl;

    3 匹配多次

      为什么不能取到每个match然后再取每个子表达式呢,好像只能输出全部的匹配串,没有像c#里面的Matchs的函数吗?难不成要自己撸一个

      string a1="a ship a ship";
      regex r("a (\\w*)");
      string rep="an $1";
      cmatch cm;
      sregex_token_iterator it(a1.begin(),a1.end(),r);
      sregex_token_iterator it2;
      for (;it!=it2;it++)
      {
      cout<<(*it)<<endl;
      }

         据说regex对中文支持不好,需要使用宽字符才能正常工作

       regex让我越发觉得c++是反人类语言了

  • 相关阅读:
    笔记:Why don't you pull up a chair and give this lifestyle a try?
    使用 Git 来备份 MySQL 数据库
    FastAdmin 将 PHP 框架升级到 ThinkPHP 5.1
    javascript的冻结对象之freeze(),isFrozen()方法
    javascript的密封对象之seal(),isSealed()方法
    javascript的防篡改对象之preventExtensions()方法
    自己根据js的兼容封装了一个小小的js库
    关于跨浏览器的部分代码的封装
    jQuery 的noConflict()的使用.
    jQuery的get()用法
  • 原文地址:https://www.cnblogs.com/mightofcode/p/2763156.html
Copyright © 2011-2022 走看看