c++ 中string 与boost 中正则 regex

本文总结一些常用的,好用的c++string中的方法。大部分是正统写法,也有一些奇技淫巧。

1. substr

#include <iostream>
#include <string>

int main ()
{
  std::string str="We think in generalities, but we live in details.";
  //从第3个char开始,截取长度为5的串,并返回
  std::string str2 = str.substr (3,5);     // "think"

  std::size_t pos = str.find("live");      // position of "live" in str
  //仅仅给出一个pos,这个pos代表start ,end默认为当前string的结尾
  std::string str3 = str.substr (pos);     // get from "live" to the end

  std::cout << str2 << ' ' << str3 << '\n';
  //output :think live in details
  return 0;
}

2. string 与char

std::string name = "entry";
char x = name[2]
// 此时 x == 't'  不是 x == "t" 做判断的时候需要注意

3. boost regex

前言:如果能把正则运用到炉火纯青的状态,写代码就可以四两拨千斤。几行简单的代码即可实现非常复杂的功能。
头文件 :#include <boost/regex.hpp>

规则

  • boost::regex reg("匹配规则以字符串的形式写到这里,实际上就是正则表达式")
  • dot 就是. 是通配符,dot 可以配任意字符(除\n), 如何匹配dot本身呢?转义符 \.
  • star 就是* 表示它前面的表达式可以匹配[0,∞]
  • ^ 就是补集或者某个字符串的开头 ^[13579] 表示匹配一个非1非3非5非7非9的任意字符
  • $ 就是结束字符,如\n,\r
  • () 就是子表达式的开始和结束,括号中常写一个子表达式
  • + 就是匹配前面的表达式[1,∞]次
  • | 就是或运算符
  • ?就是匹配子表达式 [0,1] 次
  • {} 限定符,指定正则表达式中一个给定的组件必须出现给定的次数才匹配。
  • 贪婪性质:*和+都具有贪婪性质,也就是默认去找最大匹配,能匹配多长匹配多长
  • 非贪婪: 在* 和+ 后面使用?表示寻找最小匹配

在线测试工具: http://tool.oschina.net/regex/#

3.1 正则匹配 regex match

  • [0-9]{1,2} 表达的是 0-99 所有数字
  • [1-9][0-9]? 表达的是1-99所有数字

3.2 正则替换 regex replace

4. 高级应用

4.1 如何得到子表达式

注意:子表达式用() 来分割。

 boost::regex r("(\\d{1,}[.]\\d{2,})|(\\d{1}[.|-]\\d{1})|(\\d{2}[.|-]\\d{1})",
    boost::regex::save_subexpression_location);
    std::cout << r.mark_count() << std::endl;
    for (unsigned i = 0; i < r.mark_count(); ++i) {
        auto range = r.subexpression(i);
        std::cout << std::string(range.first, std::next(range.second)) << '\n';
    }

输出的结果是:

3
(\d{1,}[.]\d{2,})
(\d{1}[.|-]\d{1})
(\d{2}[.|-]\d{1})

5. 常犯的错误

5.1 star* 使用错误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值