3 C++ Boost 字符,文本


目录:字符与数值转换Boostformat函数简单实用Boostformat输出人员信息小案例Boostformat数字处理Boostformat高级特性BoostString处理,大小写转换BoostString字符串查找BoostString字符串判断式BoostString字符串替换:BoostString字符串分割BoostStringtrim剔除两边字符BoostStringregex正则表达式




字符与数值转换

chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<stdio.h>#include<boost/lexical_cast.hpp>usingnamespacestd;intmain(){strings("3.14e12");doubled=boost::lexical_cast<double>(s);printf("%f\n",d);try{inti=strtol("ff",NULL,16);//C函数16进制转长×××printf("%d\n",i);//inta=boost::lexical_cast<int>("ff");//转换失败,抛异常inta=boost::lexical_cast<int>("314");//OKprintf("%d\n",a);}catch(boost::bad_lexical_cast&e){printf("%s\n",e.what());}stringns=boost::lexical_cast<string>(0xfe);cout<<ns<<endl;}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.out3140000000000.000000255314254chunli@Linux:~/boost$




Boost format函数 简单实用

chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<iomanip>#include<cassert>#include<boost/format.hpp>namespaceMyNS_ForOutput{usingstd::cout;usingstd::cerr;usingstd::string;usingstd::endl;usingstd::flush;usingboost::format;usingboost::io::group;}namespaceMyNS_Manips{usingstd::setfill;usingstd::setw;usingstd::hex;usingstd::dec;//gcc-2.95doesntdefinethenextones//usingstd::showbase;//usingstd::left;//usingstd::right;//usingstd::internal;}usingnamespaceMyNS_ForOutput;usingnamespaceMyNS_Manips;intmain(){//输出Hello占9个宽度,接着一整空格,再输出3占6个宽度.std::cout<<format("%|1$9|%|2$6|")%"Hello"%3<<std::endl;//参数任意排列cout<<format("%1%%2%%3%%2%%1%\n")%"o"%"oo"%"O";//输出-23右对齐占5个宽度,输出35左对齐占5个宽度cout<<format("(x,y)=(%1$+5d,%2$-5d)\n")%-23%35;cout<<format("(x,y)=(%+5d,%-5d)\n")%-23%35;//效果同上cout<<format("(x,y)=(%|+5|,%|-5|)\n")%-23%35;//效果同上cout<<format("(x,y)=(%|1$+5|,%|2$-5|)\n")%-23%35;//效果同上//弱类型,40.23不会因为%s而报错cout<<format("name=%s,price=%s¥,quantity=%dKG.\n")%"apple"%4.23%50;//设置C++IO,填充,输出格式,宽度,数据cout<<format("%2%%1%%2%\n")%919%group(setfill('X'),hex,setw(4),15-1);//输出不同的进制cout<<format("%1$4dis:%1$#4x,%1$#4o,%1$s,\n")%18;cout<<format("15->%%##%#x")%15<<endl;std::strings;s=str(format("%d%d")%11%22);//类似sprintfassert(s=="1122");cout<<"assertOk"<<endl;//format的异常,参数过多try{format("%1%%1%")%101%102;}catch(boost::io::too_many_args&exc){cerr<<exc.what()<<"\n别担心,这是我精心设计的错误\n";}//format的异常,参数过少try{cerr<<format("%|3$|")%101;//必须穿3个进来}catch(boost::io::too_few_args&exc){cerr<<exc.what()<<"\n别担心,这是我精心设计的错误\n";}//忽略异常formatf("%|3$|");f.exceptions(boost::io::all_error_bits^(boost::io::too_few_args_bit));f%101;cout<<"f="<<f<<endl;cerr<<"\nEverythingwentOK,exiting.\n";return0;}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.outHello3oooOooo(x,y)=(-23,35)(x,y)=(-23,35)(x,y)=(-23,35)(x,y)=(-23,35)name=apple,price=4.23¥,quantity=50KG.XXXe919XXXe18is:0x12,022,18,15->%##0xfassertOkboost::too_many_args:format-stringreferredtofewerargumentsthanwerepassed别担心,这是我精心设计的错误boost::too_few_args:format-stringreferredtomoreargumentsthanwerepassed别担心,这是我精心设计的错误f=EverythingwentOK,exiting.chunli@Linux:~/boost$



Boost format 输出人员信息 小案例

chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<iomanip>#include"boost/format.hpp"usingnamespacestd;usingboost::format;usingboost::io::group;intmain(){//宽度为6,居中显示cout<<format("_%|=6|_")%1<<endl;vector<string>names(1,"Marc-FranisMichel"),surname(1,"Durand"),tel(1,"+33(0)123456789");names.push_back("Jean");surname.push_back("deLattredeTassigny");tel.push_back("+33(0)987654321");names.push_back("工程师");surname.push_back("中国杭州");tel.push_back("+8613429678754");for(unsignedinti=0;i<names.size();++i)cout<<format("%1%,%2%,%|40t|%3%\n")%names[i]%surname[i]%tel[i];cerr<<"\nEverythingwentOK,exiting.\n";return0;}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.out_1_Marc-FranisMichel,Durand,+33(0)123456789Jean,deLattredeTassigny,+33(0)987654321工程师,中国杭州,+8613429678754EverythingwentOK,exiting.chunli@Linux:~/boost$




Boost format 数字处理

chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<iomanip>#include"boost/format.hpp"#if!(BOOST_WORKAROUND(__GNUC__,<3)&&defined(__STL_CONFIG_H))//notforbrokengccstdlib#include<boost/io/ios_state.hpp>#else//notascomplete,butcompatiblewithgcc-2.95:voidcopyfmt(ios&left,constios&right){left.fill(right.fill());left.flags(right.flags());left.exceptions(right.exceptions());left.width(right.width());left.precision(right.precision());}namespaceboost{namespaceio{classios_all_saver{std::basic_ios<char>ios_;std::ios&target_r;public:ios_all_saver(std::ios&right):ios_(0),target_r(right){copyfmt(ios_,right);}~ios_all_saver(){copyfmt(target_r,ios_);}};}}//N.S.boost::io//defineshowposandnoshowpos:classShowPos{public:boolshowpos_;ShowPos(boolv):showpos_(v){}};std::ostream&operator<<(std::ostream&os,constShowPos&x){if(x.showpos_)os.setf(ios_base::showpos);elseos.unsetf(ios_base::showpos);returnos;}ShowPosnoshowpos(false);ShowPosshowpos(true);#endif//-endgcc-2.95workarounds//---------------------------------------------------------------------------////***anexempleofUDT:aRationalclass****classRational{public:Rational(intn,unsignedintd):n_(n),d_(d){}Rational(intn,intd);//convertdenominatortounsignedfriendstd::ostream&operator<<(std::ostream&,constRational&);private:intn_;//numeratorunsignedintd_;//denominator};Rational::Rational(intn,intd):n_(n){if(d<0){n_=-n_;d=-d;}//makethedenominatoralwaysnon-negative.d_=static_cast<unsignedint>(d);}std::ostream&operator<<(std::ostream&os,constRational&r){usingnamespacestd;streamsizen,s1,s2,s3;streamsizew=os.width(0);//widthhastobezeroedbeforesavingstate.//boost::io::ios_all_saverbia_saver(os);boost::io::basic_oaltstringstream<char>oss;oss.copyfmt(os);oss<<r.n_;s1=oss.size();oss<<"/"<<noshowpos;//arationalnumberneedsonlyonesign!s2=oss.size();oss<<r.d_;s3=oss.size();n=w-s3;if(n<=0){os.write(oss.begin(),oss.size());}elseif(os.flags()&std::ios_base::internal){std::streamsizen1=w/2,n2=w-n1,t;t=(s3-s1)-n2;//is2dpart'/nnn'biggerthan1/2w?if(t>0){n1=w-(s3-s1);//putallpaddingsonfirstpart.n2=0;//minimalwidth(s3-s2)}else{n2-=s2-s1;//adjustfor'/',n2isstillw/2.}os<<setw(n1)<<r.n_<<"/"<<noshowpos<<setw(n2)<<r.d_;}else{if(!(os.flags()&std::ios_base::left)){//->rightalign.(rightbitisset,ornobitisset)os<<string(n,'');}os.write(oss.begin(),s3);if(os.flags()&std::ios_base::left){os<<string(n,'');}}returnos;}intmain(){usingnamespacestd;usingboost::format;usingboost::io::group;usingboost::io::str;strings;Rationalr(16,9);cout<<"start!"<<endl;cout<<r<<endl;//"16/9"cout<<showpos<<r<<","<<5<<endl;//"+16/9,+5"cout<<format("%02d:[%0+9d]\n")%1%r;//"01:[+016/0009]"cout<<format("%02d:[%_+9d]\n")%2%Rational(9,160);//"02:[+9/160]"cout<<format("%02d:[%_+9d]\n")%3%r;//"03:[+16/9]"cout<<format("%02d:[%_9d]\n")%4%Rational(8,1234);//"04:[8/1234]"cout<<format("%02d:[%_9d]\n")%5%Rational(1234,8);//"05:[1234/8]"cout<<format("%02d:[%09d]\n")%6%Rational(8,1234);//"06:[0008/1234]"cout<<format("%02d:[%0+9d]\n")%7%Rational(1234,8);//"07:[+1234/008]"cout<<format("%02d:[%0+9d]\n")%8%Rational(7,12345);//"08:[+07/12345]"cerr<<"\n\nEverythingwentOK,exiting.\n";return0;}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.outstart!16/9+16/9,+501:[+016/0009]02:[+9/160]03:[+16/9]04:[8/1234]05:[1234/8]06:[0008/1234]07:[+1234/008]08:[+07/12345]EverythingwentOK,exiting.chunli@Linux:~/boost$




Boost format 高级特性

chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<iomanip>#include"boost/format.hpp"namespaceMyNS_ForOutput{usingstd::cout;usingstd::cerr;usingstd::string;usingstd::endl;usingstd::flush;usingboost::format;usingboost::io::group;}namespaceMyNS_Manips{usingstd::setfill;usingstd::setw;usingstd::hex;usingstd::dec;usingstd::showbase;usingstd::left;usingstd::right;usingstd::internal;}intmain(){usingnamespaceMyNS_ForOutput;usingnamespaceMyNS_Manips;std::strings;//------------------------------------------------------------------------//storingtheparsedformat-stringina'formatter'://formatobjectsareregularobjectsthatcanbecopied,assigned,//fedarguments,dumpedtoastream,re-fedarguments,etc...//Souserscanusethemthewaytheylike.formatfmter("%1%%2%%3%%1%\n");fmter%10%20%30;cout<<fmter;//prints"10203010\n"//notethatoncethefmtergotallitsarguments,//theformattedstringstaysavailable(untilnextcallto'%')//Theresultisavailableviafunctionstr()orstream's<<:cout<<fmter;//printsthesamestringagain.//onceyoucalloperator%again,argumentsareclearedinsidetheobject//anditisanerrortoaskfortheconversionstringbeforefeedingallarguments:fmter%1001;try{cout<<fmter;}catch(boost::io::too_few_args&exc){cout<<exc.what()<<"\n\t\t***Dontworry,thatwasplanned\n";}//wejustneedtofeedthelasttwoarguments,anditwillbereadyforoutputagain:cout<<fmter%1002%1003;//prints"1001100210031001\n"cout<<fmter%10%1%2;//prints"101210\n"//---------------------------------------------------------------//usingformatobjects//modifytheformattingoptionsforagivendirective:fmter=format("%1%%2%%3%%2%%1%\n");fmter.modify_item(4,group(setfill('_'),hex,showbase,setw(5)));//这点可以深入看看cout<<fmter%1%2%3;//prints"123__0x21\n"//bindoneoftheargumets:fmter.bind_arg(1,18);//这点可以深入看看cout<<fmter%group(hex,showbase,20)%30;//%2is20,and20==0x14//prints"180x1430_0x1418\n"fmter.modify_item(4,setw(0));//cancelspreviouswidth-5fmter.bind_arg(1,77);//replace18with77forfirstargument.cout<<fmter%10%20;//prints"7710200xa77\n"try{cout<<fmter%6%7%8;//Aye!toomanyargs,becausearg1isboundalready}catch(boost::io::too_many_args&exc){cout<<exc.what()<<"\n\t\t***Dontworry,thatwasplanned\n";}//clearregulararguments,butnotboundarguments:fmter.clear();cout<<fmter%2%3;//prints"77230x277\n"//clear_binds()clearsbothregularANDboundarguments:fmter.clear_binds();cout<<fmter%1%2%3;//prints"1230x21\n"//settingdesiredexceptions:fmter.exceptions(boost::io::all_error_bits^(boost::io::too_many_args_bit));cout<<fmter%1%2%3%4%5%6;//-----------------------------------------------------------//misc://unsupportedprintfdirectives%nandasterisk-fieldsarepurelyignored.//do*NOT*provideanargumentforthem,itisanerror.cout<<format("|%5d|%n")%7<<endl;//prints"|7|"cout<<format("|%*.*d|")%7<<endl;//prints"|7|"//truncationsofstrings:cout<<format("%|.2s|%|8c|.\n")%"root"%"user";//prints"rou.\n"//manipulatorsconflictingwithformat-string:manipulatorswin.cout<<format("%2s")%group(setfill('0'),setw(6),1)<<endl;//prints"000001"cout<<format("%2$5s%1%%2$3s\n")%1%group(setfill('X'),setw(4),2);//prints"XXX21XXX2\n"//widthis4,assetbymanip,nottheformat-string.//nesting:cout<<format("%2$014x[%1%]%2$05s\n")%(format("%05s/%s")%-18%7)%group(showbase,-100);//prints"0x0000ffffff9c[-0018/7]-0100\n"cout<<"\n\nEverythingwentOK,exiting.\n";return0;}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.out1020301010203010boost::too_few_args:format-stringreferredtomoreargumentsthanwerepassed***Dontworry,thatwasplanned1001100210031001101210123__0x21180x1430_0x14187710200xa77boost::too_many_args:format-stringreferredtofewerargumentsthanwerepassed***Dontworry,thatwasplanned77230x2771230x211230x21|7||7|rou.000001XXX21XXX20x0000ffffff9c[-0018/7]-0100EverythingwentOK,exiting.chunli@Linux:~/boost$





Boost String 处理,大小写转换

chunli@Linux:~/workspace/Boost$catstr.cpp/**str.cpp**Createdon:2016年12月2日*Author:chunli*/#include<string>#include<vector>#include<iostream>#include<iterator>#include<boost/algorithm/string/case_conv.hpp>usingnamespacestd;usingnamespaceboost;intmain(){stringstr1("AbCdEfG");vector<char>vec1(str1.begin(),str1.end());cout<<"转换为小写";to_lower_copy(ostream_iterator<char>(cout),vec1);//把结构拷贝到IO流cout<<endl;copy(vec1.begin(),vec1.end(),ostream_iterator<char>(cout));//看看数组里面装的是什么cout<<endl;to_lower(vec1);//cout<<vec1<<endl;cout<<"转换为大写"<<to_upper_copy(str1)<<endl;//to_lower(str1);cout<<"转换为小写"<<str1<<endl;return0;}chunli@Linux:~/workspace/Boost$g++str.cpp-Wall&&./a.out转换为小写abcdefgAbCdEfG转换为大写ABCDEFG转换为小写abcdefgchunli@Linux:~/workspace/Boost$





Boost String 字符串查找

chunli@Linux:~/workspace/Boost$catmain.cpp#include<string>#include<iostream>#include<algorithm>#include<functional>#include<boost/algorithm/string/case_conv.hpp>#include<boost/algorithm/string/find.hpp>usingnamespacestd;usingnamespaceboost;intmain(){stringstr1("abc___cde___efg");stringstr2("abc");//查找"cde",iterator_range记录的是两个迭代器的位置iterator_range<string::iterator>range=find_first(str1,string("cde"));//range记录的是两个迭代器位置,to_upper开始转换to_upper(range);cout<<"查找cde,并转换"<<str1<<endl;//查找前3个字符iterator_range<string::iterator>head=find_head(str1,3);cout<<"head(3)ofthestr1:"<<string(head.begin(),head.end())<<endl;//查找尾部几个字符,有容错功能head=find_tail(str2,5);cout<<"tail(5)ofthestr2:"<<string(head.begin(),head.end())<<endl;chartext[]="hellodolly!";iterator_range<char*>crange=find_last(text,"ll");//crange记录最后的ll的位置transform(crange.begin(),crange.end(),crange.begin(),bind2nd(plus<char>(),2));//ll加2就是nnto_upper(crange);//crange记录最后的ll的位置cout<<text<<endl;return0;}chunli@Linux:~/workspace/Boost$g++main.cpp-Wall&&./a.out查找cde,并转换abc___CDE___efghead(3)ofthestr1:abctail(5)ofthestr2:abchellodoNNy!chunli@Linux:~/workspace/Boost$






Boost String 字符串判断式

chunli@Linux:~/workspace/Boost$catmain.cpp#include<string>#include<iostream>#include<functional>#include<boost/algorithm/string/predicate.hpp>#include<boost/algorithm/string/classification.hpp>#include<boost/bind.hpp>usingnamespacestd;usingnamespaceboost;intmain(){stringstr1("123xxx321");stringstr2("abc");//判断字符串的开头cout<<"str1startswith\"123\":"<<(starts_with(str1,string("123"))?"true":"false")<<endl;//判断字符串的结尾cout<<"str1endswith\"123\":"<<(ends_with(str1,string("123"))?"true":"false")<<endl;//判断是否存在子串cout<<"str1contains\"xxx\":"<<(contains(str1,string("xxx"))?"true":"false")<<endl;//检测两个字符串是否相等cout<<"str2equals\"abc\":"<<(equals(str2,string("abc"))?"true":"false")<<endl;//检测all里面所有的是不是符号if(all(";.,",is_punct())){cout<<"\";.,\"areallpunctuationcharacters"<<endl;}//检查str1每个字符是不是属于str2中if(all("abcxxx",is_any_of("xabc")&&!is_space())){cout<<"true"<<endl;}return0;}chunli@Linux:~/workspace/Boost$g++main.cpp-Wall&&./a.outstr1startswith"123":truestr1endswith"123":falsestr1contains"xxx":truestr2equals"abc":true";.,"areallpunctuationcharacterstruechunli@Linux:~/workspace/Boost$





Boost String 字符串替换

chunli@Linux:~/workspace/Boost$catmain.cpp#include<string>#include<iostream>#include<iterator>#include<boost/algorithm/string.hpp>usingnamespacestd;usingnamespaceboost;inlinestringupcase_formatter(constiterator_range<string::const_iterator>&Replace){stringTemp(Replace.begin(),Replace.end());to_upper(Temp);returnTemp;}intmain(){stringstr1("abc___cde___efg");//删除从6到9的字符,不影响str1cout<<erase_range_copy(str1,make_iterator_range(str1.begin()+6,str1.begin()+9))<<endl;//从6到9的字符,换成+++,只能处理3位cout<<replace_range_copy(str1,make_iterator_range(str1.begin()+6,str1.begin()+9),"+++")<<endl;//把"cde"换成"中国杭州",不影响str1replace_first_copy(ostream_iterator<char>(cout),str1,"cde","中国杭州");cout<<endl;//全部替换,不影响str1cout<<replace_all_copy(str1,"___","--")<<endl;cout<<replace_all_copy(str1,"___","----")<<endl;//全部删除,不影响str1cout<<erase_all_copy(str1,"___")<<endl;//修改第N个字符,影响str1replace_nth(str1,"_",4,"+");replace_nth(str1,"_",2,"+");cout<<str1<<endl;//忽略大小写转换stringstr2("abC-xxxx-AbC-xxxx-abc");cout<<find_format_all_copy(str2,first_finder("abc",is_iequal()),upcase_formatter)<<endl;return0;}chunli@Linux:~/workspace/Boost$g++main.cpp-Wall&&./a.outabc______efgabc___+++___efgabc___中国杭州___efgabc--cde--efgabc----cde----efgabccdeefgabc__+cde_+_efgABC-xxxx-ABC-xxxx-ABCchunli@Linux:~/workspace/Boost$






Boost String 字符串分割

chunli@Linux:~/workspace/Boost$catmain.cpp#include<string>#include<vector>#include<iostream>#include<iterator>#include<functional>#include<boost/algorithm/string/classification.hpp>#include<boost/algorithm/string/split.hpp>#include<boost/algorithm/string/find_iterator.hpp>usingnamespacestd;usingnamespaceboost;intmain(){stringstr1("abc-*-ABC-*-aBc");cout<<"Before:"<<str1<<endl;//忽略大小写查找abc,并打印出来typedeffind_iterator<string::iterator>string_find_iterator;string_find_iteratorIt=make_find_iterator(str1,first_finder("abc",is_iequal()));for(;It!=string_find_iterator();++It){cout<<copy_range<std::string>(*It)<<endl;transform(It->begin(),It->end(),It->begin(),bind2nd(plus<char>(),1));//每个字符加1}cout<<"After:"<<str1<<endl;//以-*任意字符为分隔符vector<std::string>ResultCopy;split(ResultCopy,str1,is_any_of("-*"),token_compress_on);for(unsignedintnIndex=0;nIndex<ResultCopy.size();nIndex++){cout<<nIndex<<":"<<ResultCopy[nIndex]<<endl;}return0;}chunli@Linux:~/workspace/Boost$g++main.cpp-Wall&&./a.outBefore:abc-*-ABC-*-aBcabcABCaBcAfter:bcd-*-BCD-*-bCd0:bcd1:BCD2:bCdchunli@Linux:~/workspace/Boost$





Boost String trim剔除两边字符

chunli@Linux:~/workspace/Boost$catmain.cpp#include<string>#include<iostream>#include<boost/algorithm/string/trim.hpp>#include<boost/algorithm/string/classification.hpp>usingnamespacestd;usingnamespaceboost;intmain(){stringstr1("1xxxx1");//去除左边的空格cout<<"-"<<trim_left_copy(str1)<<"-"<<endl;//去除右边的空格,直接修改对象trim_right(str1);cout<<"-"<<str1<<"-"<<endl;//去除两边含<>的任意字符stringstr2("<>tr<>im<>");cout<<"-"<<trim_copy_if(str2,is_any_of("<>"))<<"-"<<endl;//去除两边包含的任意数字字符stringstr3("123abs343");cout<<"-"<<trim_copy_if(str3,is_digit())<<"-"<<endl;return0;}chunli@Linux:~/workspace/Boost$g++main.cpp-Wall&&./a.out-1xxxx1--1xxxx1--tr<>im--abs-chunli@Linux:~/workspace/Boost$





Boost String regex正则表达式

chunli@Linux:~/workspace/Boost$catmain.cpp#include<string>#include<iostream>#include<iterator>#include<boost/regex.hpp>#include<boost/algorithm/string/regex.hpp>usingnamespacestd;usingnamespaceboost;intmain(){stringstr1("abc__(456)__123__(123)__cde");//匹配(多个数字)这样的格式cout<<replace_all_regex_copy(str1,regex("\\(([0-9]+)\\)"),string("-$1-"))<<endl;cout<<replace_all_regex_copy(str1,regex("\\(([0-9]+)\\)"),string("前$1后"))<<endl;//删除所有的字母cout<<erase_all_regex_copy(str1,regex("[[:alpha:]]+"))<<endl;///匹配(多个数字)这样的格式replace_all_regex(str1,regex("_(\\([^\\)]*\\))_"),string("-$1-"));cout<<str1<<endl;return0;}chunli@Linux:~/workspace/Boost$g++main.cpp-lboost_regex-Wall&&./a.outabc__-456-__123__-123-__cdeabc__前456后__123__前123后__cde__(456)__123__(123)__abc_-(456)-_123_-(123)-_cdechunli@Linux:~/workspace/Boost$