3 C++ Boost 字符,文本

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

wKiom1hBX1OSDBddAADHLFyPTiQ221.png

字符与数值转换


chunli@Linux:~/boost$ cat main.cpp 
#include <iostream>
#include <stdio.h>
#include <boost/lexical_cast.hpp>
using namespace std;

int main()
{
	string s("3.14e12");
	double d = boost::lexical_cast<double>(s);
	printf("%f \n",d);
	
	try
	{
		int i = strtol("ff",NULL,16);//C 函数 16进制转长×××
		printf("%d \n",i);
	
		//int a = boost::lexical_cast<int>("ff");//转换失败,抛异常
		int a = boost::lexical_cast<int>("314");//OK
		printf("%d \n",a);

	}	
	catch(boost::bad_lexical_cast &e)
	{
		printf("%s \n",e.what());
	}
		
	string ns = boost::lexical_cast<string>(0xfe);
	cout << ns <<endl;

}
chunli@Linux:~/boost$ g++ main.cpp  -Wall  && ./a.out 
3140000000000.000000 
255 
314 
254
chunli@Linux:~/boost$



Boost format函数 简单实用


chunli@Linux:~/boost$ cat main.cpp 
#include <iostream>
#include <iomanip>
#include <cassert>
#include <boost/format.hpp>
namespace MyNS_ForOutput {
	using std::cout; 
	using std::cerr;
	using std::string;
	using std::endl; 
	using std::flush;
	using boost::format;
	using boost::io::group;
}

namespace MyNS_Manips {
	using std::setfill;
	using std::setw;
	using std::hex ;
	using std::dec ;
	// gcc-2.95 doesnt define the next ones
	//  using std::showbase ;
	//  using std::left ;
	//  using std::right ;
	//  using std::internal ;
}

using namespace MyNS_ForOutput;
using namespace MyNS_Manips;

int main()
{

	//输出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$4d is : %1$#4x, %1$#4o, %1$s,\n")  % 18;
	cout << format("15 -> %%##%#x ") % 15 << endl;

	std::string s;
	s= str( format(" %d %d ") % 11 % 22 );//类似sprintf
	assert( s == " 11 22 ");
	cout << "assert Ok " << 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";
	}

	//忽略异常
	format f(" %|3$| ");
	f.exceptions(boost::io::all_error_bits ^ (boost::io::too_few_args_bit));
	f % 101;
	cout << "f=" << f << endl;

	cerr << "\nEverything went OK, exiting. \n";
	return 0;
}
chunli@Linux:~/boost$ g++ main.cpp  -Wall  && ./a.out 
    Hello      3
o oo O oo o 
(x,y) = (  -23,35   ) 
(x,y) = (  -23,35   ) 
(x,y) = (  -23,35   ) 
(x,y) = (  -23,35   )
name=apple,price=4.23¥,quantity=50KG.
XXXe 919 XXXe
  18 is : 0x12,  022, 18,
15 -> %##0xf 
assert Ok 
boost::too_many_args: format-string referred to fewer arguments than were passed
别担心,这是我精心设计的错误
boost::too_few_args: format-string referred to more arguments than were passed
别担心,这是我精心设计的错误
f=  

Everything went OK, exiting. 
chunli@Linux:~/boost$


Boost format 输出人员信息 小案例


chunli@Linux:~/boost$ cat main.cpp 
#include <iostream>
#include <iomanip>
#include "boost/format.hpp"

using namespace std;
using boost::format;
using boost::io::group;
int main()
{	
	//宽度为6,居中显示
	cout << format("_%|=6|_") % 1 << endl;

	vector<string>  names(1, "Marc-Fran is Michel"), 
			surname(1,"Durand"), 
			tel(1, "+33 (0) 123 456 789");

	names.push_back("Jean"); 
	surname.push_back("de Lattre de Tassigny");
	tel.push_back("+33 (0) 987 654 321");

	names.push_back("工程师"); 
	surname.push_back("中国杭州");
	tel.push_back("+86 134 2967 8754");

	for(unsigned int i=0; i<names.size(); ++i)
		cout << format("%1%, %2%, %|40t|%3%\n") % names[i] % surname[i] % tel[i];


	cerr << "\nEverything went OK, exiting. \n";
	return 0;
}

chunli@Linux:~/boost$ g++ main.cpp  -Wall  && ./a.out 
_   1  _
Marc-Fran is Michel, Durand,            +33 (0) 123 456 789
Jean, de Lattre de Tassigny,            +33 (0) 987 654 321
工程师, 中国杭州,                +86 134 2967 8754

Everything went OK, exiting. 
chunli@Linux:~/boost$



Boost format 数字处理


chunli@Linux:~/boost$ cat main.cpp 
#include <iostream>
#include <iomanip>
#include "boost/format.hpp"

#if !(BOOST_WORKAROUND(__GNUC__, < 3) && defined(__STL_CONFIG_H) ) 
// not for broken gcc stdlib
#include <boost/io/ios_state.hpp>

#else
// not as complete, but compatible with gcc-2.95 :

void copyfmt(ios& left, const ios& right) {
	left.fill(right.fill());
	left.flags(right.flags() );
	left.exceptions(right.exceptions());
	left.width(right.width());
	left.precision(right.precision());
}

namespace boost { namespace io {
	class ios_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


// define showpos and noshowpos : 
class ShowPos {
	public:
		bool showpos_;
		ShowPos(bool v) : showpos_(v) {}
};
std::ostream& operator<<(std::ostream& os, const ShowPos& x) { 
	if(x.showpos_) 
		os.setf(ios_base:: showpos);
	else
		os.unsetf(ios_base:: showpos);
	return os; 
}
ShowPos noshowpos(false);
ShowPos showpos(true);

#endif // -end gcc-2.95 workarounds



//---------------------------------------------------------------------------//
//  *** an exemple of UDT : a Rational class ****
class Rational {
	public:
		Rational(int n, unsigned int d) : n_(n), d_(d) {}
		Rational(int n, int d);    // convert denominator to unsigned
		friend std::ostream& operator<<(std::ostream&, const Rational&);
	private:
		int n_;               // numerator
		unsigned int d_;      // denominator
};

Rational::Rational(int n, int d) : n_(n) 
{
	if(d < 0) { n_ = -n_; d=-d; } // make the denominator always non-negative.
	d_ = static_cast<unsigned int>(d);
}

std::ostream& operator<<(std::ostream& os, const Rational& r) {
	using namespace std;
	streamsize  n, s1, s2, s3;
	streamsize w = os.width(0); // width has to be zeroed before saving state.
	//  boost::io::ios_all_saver  bia_saver (os); 

	boost::io::basic_oaltstringstream<char> oss;
	oss.copyfmt(os );
	oss << r.n_; 
	s1 = oss.size();
	oss << "/" << noshowpos; // a rational number needs only one sign !
	s2 = oss.size();
	oss << r.d_ ;
	s3 = oss.size();

	n = w - s3;
	if(n <= 0) {
		os.write(oss.begin(), oss.size());
	}
	else if(os.flags() & std::ios_base::internal) {
		std::streamsize n1 = w/2, n2 = w - n1,  t;
		t = (s3-s1) - n2; // is 2d part '/nnn' bigger than 1/2 w ?
		if(t > 0)  {
			n1 = w -(s3-s1); // put all paddings on first part.
			n2 = 0; // minimal width (s3-s2)
		} 
		else {
			n2 -= s2-s1; // adjust for '/',   n2 is still w/2.
		}
		os << setw(n1) << r.n_ << "/" << noshowpos << setw(n2) << r.d_;
	}
	else {
		if(! (os.flags() & std::ios_base::left)) { 
			// -> right align. (right bit is set, or no bit is set)
			os << string(n, ' ');
		}
		os.write(oss.begin(), s3);
		if( os.flags() & std::ios_base::left ) {
			os << string(n, ' ');
		}
	}

	return os;
}



int main(){
	using namespace std;
	using boost::format;
	using boost::io::group; 
	using boost::io::str;
	string s;

	Rational  r(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\nEverything went OK, exiting. \n";
	return 0;
}

chunli@Linux:~/boost$ g++ main.cpp  -Wall  && ./a.out 
start ! 
16/9
+16/9, +5
01 : [+016/0009] 
02 : [+  9/ 160] 
03 : [+ 16/   9] 
04 : [   8/1234] 
05 : [1234/   8] 
06 : [0008/1234] 
07 : [+1234/008] 
08 : [+07/12345] 


Everything went OK, exiting. 
chunli@Linux:~/boost$



Boost format 高级特性


chunli@Linux:~/boost$ cat main.cpp 
#include <iostream>
#include <iomanip>
#include "boost/format.hpp"

namespace MyNS_ForOutput {
	using std::cout; using std::cerr;
	using std::string;
	using std::endl; using std::flush;

	using boost::format;
	using boost::io::group;
}

namespace MyNS_Manips {
	using std::setfill;
	using std::setw;
	using std::hex ;
	using std::dec ;
	using std::showbase ;
	using std::left ;
	using std::right ;
	using std::internal ;
}

int main(){
	using namespace MyNS_ForOutput;
	using namespace MyNS_Manips;

	std::string s;

	//------------------------------------------------------------------------
	// storing the parsed format-string in a 'formatter' : 
	// format objects are regular objects that can be copied, assigned, 
	// fed arguments, dumped to a stream, re-fed arguments, etc... 
	// So users can use them the way they like.

	format fmter("%1% %2% %3% %1% \n");
	fmter % 10 % 20 % 30; 
	cout  << fmter;
	//          prints  "10 20 30 10 \n"

	// note that once the fmter got all its arguments, 
	// the formatted string stays available  (until next call to '%')
	//    The result is  available via function str() or stream's << :
	cout << fmter; 
	//          prints the same string again.


	// once you call operator% again, arguments are cleared inside the object
	// and it is an error to ask for the conversion string before feeding all arguments :
	fmter % 1001;
	try  { cout << fmter;   }
	catch (boost::io::too_few_args& exc) { 
		cout <<  exc.what() << "\n\t\t***Dont worry, that was planned\n";
	}

	// we just need to feed the last two arguments, and it will be ready for output again :
	cout << fmter % 1002 % 1003;
	//          prints  "1001 1002 1003 1001 \n"

	cout  << fmter % 10 % 1 % 2;
	//          prints  "10 1 2 10 \n"



	//---------------------------------------------------------------
	// using format objects 

	// modify the formatting options for a given directive :
	fmter = format("%1% %2% %3% %2% %1% \n");
	fmter.modify_item(4, group(setfill('_'), hex, showbase, setw(5)) );// 这点可以深入看看
	cout << fmter % 1 % 2 % 3;
	//          prints  "1 2 3 __0x2 1 \n"

	// bind one of the argumets :
	fmter.bind_arg(1, 18);// 这点可以深入看看
	cout << fmter % group(hex, showbase, 20) % 30;  // %2 is 20, and 20 == 0x14
	//          prints  "18 0x14 30  _0x14 18 \n"


	fmter.modify_item(4, setw(0)); // cancels previous width-5
	fmter.bind_arg(1, 77); // replace 18 with 77 for first argument.
	cout << fmter % 10 % 20;
	//          prints  "77 10 20 0xa 77 \n"

	try  
	{ 
		cout << fmter % 6 % 7 % 8;   // Aye ! too many args, because arg1 is bound already
	}
	catch (boost::io::too_many_args& exc) 
	{ 
		cout <<  exc.what() << "\n\t\t***Dont worry, that was planned\n";
	}

	// clear regular arguments, but not bound arguments :
	fmter.clear();
	cout << fmter % 2 % 3;
	//          prints "77 2 3 0x2 77 \n"

	// clear_binds() clears both regular AND bound arguments :
	fmter.clear_binds(); 
	cout << fmter % 1 % 2 % 3;
	//          prints  "1 2 3 0x2 1 \n"


	// setting desired exceptions :
	fmter.exceptions( boost::io::all_error_bits ^( boost::io::too_many_args_bit ) );
	cout << fmter % 1 % 2 % 3 % 4 % 5 % 6 ;


	// -----------------------------------------------------------
	// misc:

	// unsupported printf directives %n and asterisk-fields are purely ignored.
	// do *NOT* provide an argument for them, it is an error.
	cout << format("|%5d| %n") % 7 << endl;
	//          prints  "|    7| "
	cout << format("|%*.*d|")  % 7 << endl;
	//          prints "|7|"


	// truncations of strings :
	cout << format("%|.2s| %|8c|.\n") % "root" % "user";
	//          prints  "ro        u.\n"


	// manipulators conflicting with format-string : manipulators win.
	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  "XXX2 1 XXX2\n"  
	//          width is 4, as set by manip, not the format-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\nEverything went OK, exiting. \n";
	return 0;
}

chunli@Linux:~/boost$ g++ main.cpp  -Wall  && ./a.out 
10 20 30 10 
10 20 30 10 
boost::too_few_args: format-string referred to more arguments than were passed
		***Dont worry, that was planned
1001 1002 1003 1001 
10 1 2 10 
1 2 3 __0x2 1 
18 0x14 30 _0x14 18 
77 10 20 0xa 77 
boost::too_many_args: format-string referred to fewer arguments than were passed
		***Dont worry, that was planned
77 2 3 0x2 77 
1 2 3 0x2 1 
1 2 3 0x2 1 
|    7| 
|7|
ro        u.
000001
XXX2 1 XXX2
0x0000ffffff9c [-0018 / 7] -0100


Everything went OK, exiting. 
chunli@Linux:~/boost$




Boost String 处理,大小写转换


chunli@Linux:~/workspace/Boost$ cat str.cpp 
/*
 * str.cpp
 *
 *  Created on: 2016年12月2日
 *      Author: chunli
 */

#include <string>
#include <vector>
#include <iostream>
#include <iterator>
#include <boost/algorithm/string/case_conv.hpp>

using namespace std;
using namespace boost;

int main()
{
	string str1("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;

	return 0;
}

chunli@Linux:~/workspace/Boost$ g++ str.cpp  -Wall  && ./a.out 
转换为小写abcdefg
AbCdEfG
转换为大写ABCDEFG
转换为小写abcdefg
chunli@Linux:~/workspace/Boost$




Boost String  字符串查找 



chunli@Linux:~/workspace/Boost$ cat main.cpp 
#include <string>
#include <iostream>
#include <algorithm>
#include <functional>
#include <boost/algorithm/string/case_conv.hpp>
#include <boost/algorithm/string/find.hpp>

using namespace std;
using namespace boost;

int main()
{  
	string str1("abc___cde___efg");
	string str2("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) of the str1: " << string( head.begin(), head.end() ) << endl;

	//查找尾部几个字符,有容错功能
	head=find_tail( str2, 5 );
	cout << "tail(5) of the str2: " << string( head.begin(), head.end() ) << endl;

	char text[]="hello dolly!";
	iterator_range<char*> crange=find_last(text,"ll");//crange记录最后的ll的位置

	transform( crange.begin(), crange.end(), crange.begin(), bind2nd( plus<char>(), 2 ) );//ll加2就是nn
	to_upper( crange );	//crange记录最后的ll的位置
	cout << text << endl;
	return 0;
}
chunli@Linux:~/workspace/Boost$ g++ main.cpp  -Wall  && ./a.out 
查找cde,并转换 abc___CDE___efg
head(3) of the str1: abc
tail(5) of the str2: abc
hello doNNy!
chunli@Linux:~/workspace/Boost$





Boost String 字符串判断式


chunli@Linux:~/workspace/Boost$ cat main.cpp 
#include <string>
#include <iostream>
#include <functional>
#include <boost/algorithm/string/predicate.hpp>
#include <boost/algorithm/string/classification.hpp>
#include <boost/bind.hpp>


using namespace std;
using namespace boost;

int main()
{
	string str1("123xxx321");
	string str2("abc");

	// 判断字符串的开头
	cout << "str1 starts with \"123\": " << (starts_with( str1, string("123") )?"true":"false") << endl; 

	// 判断字符串的结尾
	cout << "str1 ends with \"123\": " << (ends_with( str1, string("123") )?"true":"false") << endl; 

	// 判断是否存在子串
	cout << "str1 contains \"xxx\": " << (contains( str1, string("xxx") )?"true":"false") << endl; 

	// 检测两个字符串是否相等
	cout << "str2 equals \"abc\": " << (equals( str2, string("abc") )?"true":"false") << endl; 

	// 检测all里面所有的是不是 符号
	if ( all(";.,", is_punct() ) )
	{
		cout << "\";.,\" are all punctuation characters" << endl;  
	}

	// 检查str1每个字符 是不是属于 str2中 
	if ( all("abcxxx", is_any_of("xabc") && !is_space() ) )
	{
		cout << "true" << endl;
	}
	return 0;
}   

chunli@Linux:~/workspace/Boost$ g++ main.cpp  -Wall  && ./a.out 
str1 starts with "123": true
str1 ends with "123": false
str1 contains "xxx": true
str2 equals "abc": true
";.," are all punctuation characters
true
chunli@Linux:~/workspace/Boost$




Boost String 字符串替换


chunli@Linux:~/workspace/Boost$ cat main.cpp 
#include <string>
#include <iostream>
#include <iterator>
#include <boost/algorithm/string.hpp>

using namespace std;
using namespace boost;

inline string upcase_formatter( const iterator_range<string::const_iterator>& Replace )
{
	string Temp(Replace.begin(), Replace.end());
	to_upper(Temp);
	return Temp;
}

int main()
{  
	string str1("abc___cde___efg");

	//删除从6到9的字符,不影响str1
	cout  << 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" 换成"中国杭州",不影响str1
	replace_first_copy( ostream_iterator<char>(cout), str1, "cde", "中国杭州" );
	cout << endl;

	// 全部替换,不影响str1
	cout << replace_all_copy( str1, "___", "--" ) << endl;
	cout << replace_all_copy( str1, "___", "----" ) << endl;

	// 全部删除,不影响str1
	cout << erase_all_copy( str1, "___" ) << endl;

	// 修改第N个字符,影响str1
	replace_nth( str1, "_", 4, "+" );
	replace_nth( str1, "_", 2, "+" );
	cout << str1 << endl;
	
	//忽略大小写转换 
	string str2("abC-xxxx-AbC-xxxx-abc");
	cout << find_format_all_copy( str2,first_finder("abc", is_iequal()), upcase_formatter ) << endl;

	return 0;
}

chunli@Linux:~/workspace/Boost$ g++ main.cpp  -Wall  && ./a.out 
abc______efg
abc___+++___efg
abc___中国杭州___efg
abc--cde--efg
abc----cde----efg
abccdeefg
abc__+cde_+_efg
ABC-xxxx-ABC-xxxx-ABC
chunli@Linux:~/workspace/Boost$





Boost String  字符串分割


chunli@Linux:~/workspace/Boost$ cat main.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>
using namespace std;
using namespace boost;

int main()
{  
	string str1("abc-*-ABC-*-aBc");
	cout << "Before: " << str1 << endl;

	//忽略大小写查找abc,并打印出来
	typedef find_iterator<string::iterator> string_find_iterator;
	string_find_iterator It = 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(unsigned int nIndex=0; nIndex<ResultCopy.size(); nIndex++)
	{
		cout << nIndex << ":" << ResultCopy[nIndex] << endl;
	}
	return 0;
}
chunli@Linux:~/workspace/Boost$ g++ main.cpp  -Wall  && ./a.out 
Before: abc-*-ABC-*-aBc
abc
ABC
aBc
After: bcd-*-BCD-*-bCd
0:bcd
1:BCD
2:bCd
chunli@Linux:~/workspace/Boost$




Boost String trim剔除两边字符


chunli@Linux:~/workspace/Boost$ cat main.cpp 
#include <string>
#include <iostream>
#include <boost/algorithm/string/trim.hpp>
#include <boost/algorithm/string/classification.hpp>

using namespace std;
using namespace boost;

int main()
{
	string str1("     1x x x x1     ");

	// 去除左边的空格
	cout <<"-" << trim_left_copy( str1 ) << "-"<< endl;

	// 去除右边的空格,直接修改对象
	trim_right( str1 );
	cout << "-" << str1 << "-" << endl;

	//去除两边 含< >的任意字符
	string str2("<> tr <> im <>");
	cout << "-"<< trim_copy_if( str2, is_any_of("< >") ) << "-" << endl;

	//去除两边包含的任意数字字符
	string str3("123abs343");
	cout << "-" << trim_copy_if( str3, is_digit() ) << "-" << endl;
	return 0;
}
chunli@Linux:~/workspace/Boost$ g++ main.cpp  -Wall  && ./a.out 
-1x x x x1     -
-     1x x x x1-
-tr <> im-
-abs-
chunli@Linux:~/workspace/Boost$




Boost String  regex正则表达式


chunli@Linux:~/workspace/Boost$ cat main.cpp 
#include <string>
#include <iostream>
#include <iterator>
#include <boost/regex.hpp>
#include <boost/algorithm/string/regex.hpp>

using namespace std;
using namespace boost;

int main()
{  
	string str1("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;
	return 0;
}

chunli@Linux:~/workspace/Boost$ g++ main.cpp -l boost_regex -Wall  && ./a.out 
abc__-456-__123__-123-__cde
abc__前456后__123__前123后__cde
__(456)__123__(123)__
abc_-(456)-_123_-(123)-_cde
chunli@Linux:~/workspace/Boost$