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-字符文本处理的更多相关文章

  1. .NET 中字符文本中的字符太多 错误处理

    错误截图   问题描述    在ASP.NET中使用多层引号,要引起注意,引号使用不当会引起“字符文本中字段太多”编译错误!今天我就遇到了这个错误,整理于此!     “字符文本中字段太多”错误提示过 ...

  2. C# Split 字符文本中的字符太多

    问题: ] { '<h1>', '</h1>' }); 原因: Split()里面是用char类型不是string字符串类型,所以只能用一个字符,必须先把多个字符替换成一个字符 ...

  3. 纯手动拉WebPanel页面保存出现错误提示 "error:字符文本中的字符太多"

    环境为.Net 没有使用WorkWithPlus 纯手拉WebFrom页面  问题出现情况如下:在拉页面的过程中拖了3个Value类型的变量到Table中 页面如下 但是在我保存的时候 发现提示如下错 ...

  4. 查看文本[Linux]

    查看文本 不分屏查看 cat (默认标准输入到标准输出) -n(行号) 连接...并显示 -E(每行行尾打印$) 翻屏:shift+pageUp/pageDown tac reverse cat 分屏 ...

  5. PHP实现把文本中的URL转换为链接的auolink()

    转载:http://www.jb51.net/article/52916.htm 其实我在<把文本中的URL地址转换为可点击链接的JavaScript.PHP自定义函数>一文中介绍过PHP ...

  6. 【转】关于字符编码,你所需要知道的(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 ...

  7. cut - 小巧的文本截取工具

    简介 cut命令是Unix下的一个命令行程序.cut命令是以行为单位来处理的.cut命令处理的是标准输入,所以可以结合管道来进行文本的处理. 命令格式 cut option… [file]… cut命 ...

  8. UTF8与GBK、GB2312等其他字符编码的相互转换

    utf8与其他字符编码的转换是国际化必然遇到的问题. windows的api函数对: WideCharToMultiByte和MultiByteToWideChar 个人喜欢的跨平台库: 单纯做字符编 ...

  9. CSS文本

    CSS文字及文本 导航:1.文字及文本2.例子 1.文字及文本文字: 单个字符文本: 多个字符的组合体 2.例子2.1.文字的颜色颜色属性被用来设置文字的颜色格式: color:色值颜色是通过CSS最 ...

  10. 使用sklearn做文本特征提取

    提取文本的特征,把文本用特征表示出来,是文本分类的前提,使用sklearn做文本的特征提取,需要导入TfidfVectorizer模块. from sklearn.feature_extraction ...

随机推荐

  1. “永恒之蓝”(Wannacry)蠕虫全球肆虐 安装补丁的方法

    “永恒之蓝”利用0day漏洞 ,通过445端口(文件共享)在内网进行蠕虫式感染传播,没有安装安全软件或及时更新系统补丁的其他内网用户就极有可能被动感染,所以目前感染用户主要集中在企业.高校等内网环境下 ...

  2. WordPress版微信小程序2.2.8版发布

    距离上次更新已经一个月了,这期间对WordPress版微信小程序 做的不少小的更新和性能的优化,此次版本更新推出了两个比较重点的功能:点赞和赞赏.同时,优化了文章页面的功能布局,在评论区把常用的功能: ...

  3. Oracle 循环查询

    select * from sys_department start with departmentid = '0303e461-2454-4d5a-bfea-2cd5a4c064c6' connec ...

  4. oracle 序列sequence

    查询所有的序列: select 'create sequence '||sequence_name|| ' minvalue '||min_value|| ' maxvalue '||max_valu ...

  5. leetcode20:有效的括号

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符串可被认 ...

  6. IDLE的GUI交互模式下完美清屏

    IDLE的GUI交互模式下完美清屏==============================================================================1.首先把 ...

  7. This iPhone 6s is running iOS 11.3.1 (15E302), which may not be supported by this version of Xcode.

    This iPhone 6s is running iOS 11.3.1 (15E302), which may not be supported by this version of Xcode.

  8. 【原创】python嗅探QQ消息实战

    目录 需求分析 选型 设计与流程 实现过程 结果展示 1 需求分析   在一些业务场景中需要拿到IM上的通信记录来做一些数据分析,例如对QQ平台中的消息进行领域分类等. 2 选型 环境与工具: pyt ...

  9. python爬虫小说代码,可用的

    python爬虫小说代码,可用的,以笔趣阁为例子,python3.6以上,可用 作者的QQ:342290433,汉唐自远工程师 import requests import refrom lxml i ...

  10. python note 01 计算机基础与变量

    1.计算机基础. 2.python历史. 宏观上:python2 与 python3 区别: python2 源码不标准,混乱,重复代码太多, python3 统一 标准,去除重复代码. 3.pyth ...