本文总结一些常用的,好用的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})