boost-字符文本处理
1、lexical_cast
一些常见的数值,字符互转函数:
整型int:
itoa()、_itoa_s
atoi()、_ttoi
无符号整型unsigned int:
_ultoa_s()、_ultot_s
strtoul()、_tcstoul
长整型long long:
_i64toa_s()、_i64tot_s
_atoi64()、_ttoi64,strtoll(C99/C++11)
无符号长整型unsigned long long:
_ui64toa_s()、_ui64tot_s
_strtoui64()、_tcstoui64,strtoull(C99/C++11)
浮点型double:
atof()、_ttof,strtod
char buf[10] = {0};
_gcvt_s(buf, 10, 12.345, 5);//最后一个参数为要转换的位数
boost的lexical_cast提供数字、字符串之间的相互转换,可以用来替代上面的atoi、itoa、strtol等,使用需要包含boost\lexical_cast.hpp:
int x = lexical_cast<int>("");
double d = lexical_cast<double>("3.14");
string str = lexical_cast<string>();
string str2 = lexical_cast<string>(3.14);
需要注意的是当浮点数float、double转化为字符串的时候会将不精确的数字也转换,如上面的3.14转换成了"3.1400000000000001",如果需要指定小数位数的转换的话可以使用下面的format。
当lexical_cast无法执行转换操作时会抛出bad_lexical_cast异常,它是std::bad_cast的派生类,我们可以实现一个模板函数来判断用户输入的是否是有效的数值:
template<typename T>
bool num_valid(const char* pStr)
{
try
{
lexical_cast<T>(pStr);
return true;
}
catch (bad_lexical_cast)
{
return false;
}
} bool bRet;
char* pInputStr = "";
bRet = num_valid<int>(pInputStr); //输入有效
pInputStr = "123test";
bRet = num_valid<int>(pInputStr); //输入无效
lexcical_cast对于转换对象有三个要求:转换起点对象是可流输出的,即定义了operator<<;转换终点对象是可流输入的,即定义了operator>>;转换终点对象必须是可缺省构造和拷贝构造的。C++中的内建类型int、double等以及std::string都满足前面的可转换条件,而STL中的容器则不可转换,对于用户自定义类型需要满足前面三个条件可以进行转换。
2、format
format可以把参数格式化到一个字符串中,而且是类型安全的,使用format需要包含头文件"boost\format.hpp",使用示例:
string str = "value";
int num = ; cout << format("%s: %d \n") % str % num; //format支持流输出,可以直接向输出流cout输出内部保存的字符串,输出value: 100 format fmt("%s: %d, %s: %d \n");
fmt % str % num;
fmt % str % num; //可以多次输入参数
string strFmt = fmt.str(); //strFmt为 value: 100, value: 100 fmt.clear();
fmt % "test" % % "test2" %;
cout << fmt; format fot("%1%: %2%, %1%: %2% \n"); // %n%用来指定使用的参数
fot % str % num;
cout << fot; //输出 value: 100, value: 100 fot.parse("%f \n");
fot % 3.14;
cout << fot; //输出 3.140000
format对象的一些成员函数:
str():返回内部已经格式化好的字符串
size():相当于str().size()
clear():清空内部缓存,执行后立即调用str()或size()会抛出异常
parse():清空内部缓存并使用一个新的格式化字符串,执行后立即调用str()或size()会抛出异常
参数及其数量必须匹配格式化字符串中要求的参数及数量,否则使用<<输出format对象、调用成员函数str()、size()等会抛出异常,所以使用format的时候最好加上异常处理。
format基本继承了printf的格式化语法,如:
%05d:输出宽度为5的整数,不足位用0填充
%-8.3f:输出左对齐,宽度为8,小数位3位的浮点数
% 10s:输出宽度为10的字符串,不足位用空格填充
%5X:输出宽度为5的大写十六进制整数
format要比printf速度慢几倍,可以先建立const format对象,然后拷贝这个对象进行格式化操作,这样比直接使用format对象能够提高一些速度:
const format fmt("%d, %d");
string str = (format(fmt) % % ).str();
3、string_algo
string_algo是一个非常全面的字符串算法库,使用它需要包含头文件"boost\algorithm\string.hpp",算法库的命名规范符合标准库的惯例:前缀i表示是大小写不敏感的,后缀_copy即为不改变原输入的copy版本,后缀_if表示使用一个谓词函数对象,很多算法都有包含这三个版本的函数,使用示例:
#include "boost\algorithm\string.hpp" int main()
{
string str("readme.txt"); boost::to_upper(str);
string strUpper = boost::to_lower_copy(str); bool bRet = boost::starts_with(str, "read");
bRet = boost::iends_with(strUpper, "txt");
bRet = boost::contains(str, "me");
boost::all(str, boost::is_lower()); //判断每个字符是否都是小写
boost::all(str, boost::is_alpha()); //判断每个字符是否都是字母
boost::all(str, boost::is_digit()); //判断每个字符是否都是十进制数字
boost::all(str, boost::is_alnum()); //判断每个字符是否都是字母或数字
boost::all(str, boost::is_any_of("*+-")); //判断每个字符是否都是*或+或- boost::trim(str);
boost::trim_if(str, boost::is_lower() || boost::is_digit());//清除两端小写的字符或数字
boost::trim_left(str); str = "readme.txt";
boost::iterator_range<string::iterator> rge; //boost::iterator_range相当于容器(string)的子区间类型,它有begin()、end()、size()、empty()等成员函数。
rge = boost::find_first(str, "me"); //查找首次出现的位置
if (rge/*!rge.empty()*/) //rge可以隐式转换为bool,所以有两种方法判断查找的结果
{
int iFoundPos = rge.begin() - str.begin(); //iFoundPos为4
string strFind(rge.begin(), rge.end()); //strFind为"me"
string strFull(rge.begin(), str.end()); //strFull为me.txt
int a = ;
}
boost::find_last(str, "txt"); //查找最后一次出现的位置
boost::find_nth(str, "dm", ); //查找"dm第二次出现的位置" str = "abc, TestD, test";
vector<string> vs;
boost::ifind_all(vs, str, "test"); //查找所有出现的位置
for (auto obj : vs)
{
string s = obj;
cout << s << ","; //输出为Test, test
}
vector<boost::iterator_range<string::iterator>> vr;
boost::ifind_all(vr, str, "test");
for (auto obj : vr)
{
string strSub(obj.begin(), obj.end());
cout << strSub << ","; //输出为Test, test string strTemp(obj.begin(), str.end());
cout << strTemp << ";"; //输出为TestD, test; test int iFoundPos = obj.begin() - str.begin();
cout << iFoundPos << ","; //输出为5, 12
} replace / erase_all(); //替换/删除所有出现的字符串
replace / erase_first(); //替换/删除第一次出现的字符串
replace / erase_last(); //替换/删除所有出现的字符串
replace / erase_nth(); //替换/删除第n + 1次出现的字符串
replace / erase_head(); //替换/删除开头的n个字符串
replace / erase_tail(); //替换/删除结尾的n个字符串 //split()以指定单个字符分割字符串到一个容器中,其参数列表的最后是一个带默认参数,取值可为token_compress_on、token_compress_off
//token_compress_on表示连续两个分割字符出现时视为一个,token_compress_off为正常操作(会分割出一个空字符串来)。
str = "c++ java c#";
list<string> l;
boost::split(l, str, boost::is_space()); //以空格分割
auto it = l.begin();
for (; it != l.end(); ++it)
{
string str = *it;
cout << str << ","; //输出为c++, java, c#
} std::vector<std::string> vc;
boost::split(vc, str, boost::is_any_of(" ")); //以空格分割
for (auto& item : vc)
{
cout << item << ","; //输出为c++, java, c#,
} struct SIs_space
{
bool operator()(const char& ch)const
{
return ch == ' ';
}
};
list<boost::iterator_range<string::iterator>> lr;
boost::split(lr, str, SIs_space());
auto iter = lr.begin();
for (; iter != lr.end(); ++iter)
{
string strSub(iter->begin(), iter->end());
cout << strSub << ","; //输出为c++, java, c# string strTemp(iter->begin(), str.end());
cout << strTemp << ";"; //输出为c++ java c#; java c#; c# int iFoundPos = iter->begin() - str.begin();
cout << iFoundPos << ","; //输出为0, 4, 9
} //使用分割迭代器来分割字符串,可以以多个字符来分割
str = "Samus || samus || mario |||| Link";
typedef boost::split_iterator<string::iterator> string_split_iterator;
string_split_iterator p, endp;
for (p = boost::make_split_iterator(str, boost::first_finder("||", boost::is_equal())); p != endp; ++p)
{
string strSub = string(p->begin(), p->end());
//cout << strSub << ","; //输出为Samus , samus , mario ,, Link string strFull = string(p->begin(), str.end());
cout << strFull << ","; //输出为 Samus || samus || mario |||| Link, samus || mario |||| Link, mario |||| Link, || Link, Link int iPos = p->begin() - str.begin();
cout << iPos << ","; //输出为0, 8, 17, 26, 28
} return ;
}
4、tokenizer
使用tokenizer库可以很容易的执行分词操作,但它只支持使用单个字符进行分词,而且它对wstring(unicode)缺乏完善的考虑。通常建议使用string_algo或正则表达式来替换它的工作。
5、xpressive
xpressive是一个功能强大的正则表达式库,它比原正则表达式库boost.regex速度更快,而且不用编译。xpressive不仅是一个类似boost.regex的正则表达式解析器,还是一个类似于boost.spirit的语法分析器,并且将这两种不相交的文本处理方式融合在了一起。
c++11中已经有了正则表达式类regex。
boost-字符文本处理的更多相关文章
- .NET 中字符文本中的字符太多 错误处理
错误截图 问题描述 在ASP.NET中使用多层引号,要引起注意,引号使用不当会引起“字符文本中字段太多”编译错误!今天我就遇到了这个错误,整理于此! “字符文本中字段太多”错误提示过 ...
- C# Split 字符文本中的字符太多
问题: ] { '<h1>', '</h1>' }); 原因: Split()里面是用char类型不是string字符串类型,所以只能用一个字符,必须先把多个字符替换成一个字符 ...
- 纯手动拉WebPanel页面保存出现错误提示 "error:字符文本中的字符太多"
环境为.Net 没有使用WorkWithPlus 纯手拉WebFrom页面 问题出现情况如下:在拉页面的过程中拖了3个Value类型的变量到Table中 页面如下 但是在我保存的时候 发现提示如下错 ...
- 查看文本[Linux]
查看文本 不分屏查看 cat (默认标准输入到标准输出) -n(行号) 连接...并显示 -E(每行行尾打印$) 翻屏:shift+pageUp/pageDown tac reverse cat 分屏 ...
- PHP实现把文本中的URL转换为链接的auolink()
转载:http://www.jb51.net/article/52916.htm 其实我在<把文本中的URL地址转换为可点击链接的JavaScript.PHP自定义函数>一文中介绍过PHP ...
- 【转】关于字符编码,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)
转载地址:http://www.imkevinyang.com/2010/06/%E5%85%B3%E4%BA%8E%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%EF%BC ...
- cut - 小巧的文本截取工具
简介 cut命令是Unix下的一个命令行程序.cut命令是以行为单位来处理的.cut命令处理的是标准输入,所以可以结合管道来进行文本的处理. 命令格式 cut option… [file]… cut命 ...
- UTF8与GBK、GB2312等其他字符编码的相互转换
utf8与其他字符编码的转换是国际化必然遇到的问题. windows的api函数对: WideCharToMultiByte和MultiByteToWideChar 个人喜欢的跨平台库: 单纯做字符编 ...
- CSS文本
CSS文字及文本 导航:1.文字及文本2.例子 1.文字及文本文字: 单个字符文本: 多个字符的组合体 2.例子2.1.文字的颜色颜色属性被用来设置文字的颜色格式: color:色值颜色是通过CSS最 ...
- 使用sklearn做文本特征提取
提取文本的特征,把文本用特征表示出来,是文本分类的前提,使用sklearn做文本的特征提取,需要导入TfidfVectorizer模块. from sklearn.feature_extraction ...
随机推荐
- Core Graphices 设置渐变
Core Graphices 设置渐变 Quartz 提供了两种设置渐变的方式 CGShadingRef and CGGradientRef 尝试CGGradientRef 的使用 import & ...
- 性能测试day03_前端分析调优思路
刚刚看到有人支持我写的博客,表示还是比较感动的,发现热心的用户在我的博客留言说“一个系统每天有200万在线用户,问我怎么设计性能场景?”,其实这个问题呢就属于业务没理清,这个问题就像我问你,一个城市一 ...
- uva-10602-贪心
题意:有个编辑器,支持三种操作,摁下一个键盘上的字符,重复最后一个单词,删除最后一个字符.给N个字符串,必须先在编辑器内输入第一个字符, 问,输入完所有字符串最少需要摁下多少次键盘. 最多100个字符 ...
- asp.net 微信JsSDK
有时间再整理吧 using System; using System.Collections.Generic; using System.Linq; using System.Web; using S ...
- 分享下自己写的一个微信小程序请求远程数据加载到页面的代码
1 思路整理 就是页面加载完毕的时候 请求远程接口,然后把数据赋值给页面的变量 ,然后列表循环 2 js相关代码 我是改的 onload函数 /** * 生命周期函数--监听页面加载 */ on ...
- Apollo配置中心
背景: 当前我们项目,所有的配置基本都是通过本地properties 文件进行配置的,比如ip地址.端口.消息中间件和数据库连接的各种参数,当我们需要切换环境或调整参数的时候,我们必须手动的修改这些配 ...
- java编程思想(2)--一切都是对象
1创建对象 String s ;创建引用,并未初始化,即引用未关联任何东西 String s2="asda"; 初始化 System.out.println(s2); System ...
- adobe cc最新版 软件安装与激活
adobe cc最新版 软件安装与激活:https://m.weike.fm/lecture/4912961 说明#:Adobe CC2017的所有软件都可以按照以上方法进行安装,如:Premier ...
- CPU与内存互联的架构演变
随着计算机中CPU核数目的增加,传统的UMA(unifonn memory access)架构由于对关键硬件(如中央内存控制器)的竞争加剧出现了性能上的瓶颈,即扩展性不强.而NUMA架构则以其良好的可 ...
- python 爬虫启航2.0
文章解析: 1.正则表达式解析 2.beautifulsoup,BeautifulSoup是一个复杂的树形结构,她的每一个节点都是一个python对象,获取网页的内容就是一个提取对象内容的过程,它的提 ...