boost库regex的典型用法 [转载]
2011-09-15 19:49
253 查看
boost库regex的典型用法
2010-08-25 22:40
2010-08-25 22:40
#include "stdafx.h" #include <iostream> #include <boost/regex.hpp> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { //( 1 ) (( 3 ) 2 )(( 5 )4)( 6 ) //(\w+)://((\w+\.)*\w+)((/\w*)*)(/\w+\.\w+)? //^协议://网址(x.x...x)/路径(n个\字串)/网页文件(xxx.xxx) const char *szReg = "(\\w+)://((\\w+\\.)*\\w+)((/\\w*)*)(/\\w+\\.\\w+)?"; const char *szStr = "http://www.cppprog.com/2009/0112/48.html"; { //字符串匹配 boost::regex reg( szReg ); bool r=boost::regex_match( szStr , reg); assert(r); } { //提取子串 boost::cmatch mat; boost::regex reg( szReg ); bool r=boost::regex_match( szStr, mat, reg); if(r) //如果匹配成功 { //显示所有子串 for(boost::cmatch::iterator itr=mat.begin(); itr!=mat.end(); ++itr) { // 指向子串对应首位置 指向子串对应尾位置 子串内容 cout << itr->first-szStr << ' ' << itr->second-szStr << ' ' << *itr << endl; } } //也可直接取指定位置信息 if(mat[4].matched) cout << "Path is" << mat[4] << endl; } { //查找 boost::cmatch mat; boost::regex reg( "\\d+" ); //查找字符串里的数字 if(boost::regex_search(szStr, mat, reg)) { cout << "searched:" << mat[0] << endl; } } { //替换 boost::regex reg( szReg ); string s = boost::regex_replace( string(szStr), reg, "ftp://$2$5"); cout << "ftp site:"<< s << endl; } { //替换2,把<>&转换成网页字符 string s1 = "(<)|(>)|(&)"; string s2 = "(?1<)(?2>)(?3&)"; boost::regex reg( s1 ); string s = boost::regex_replace( string("cout << a&b << endl;"), reg, s2, boost::match_default | boost::format_all); cout << "HTML:"<< s << endl; } { //使用迭代器找出所有数字 boost::regex reg( "\\d+" ); //查找字符串里的数字 boost::cregex_iterator itrBegin = make_regex_iterator(szStr,reg); //(szStr, szStr+strlen(szStr), reg); boost::cregex_iterator itrEnd; for(boost::cregex_iterator itr=itrBegin; itr!=itrEnd; ++itr) { // 指向子串对应首位置 指向子串对应尾位置 子串内容 cout << (*itr)[0].first-szStr << ' ' << (*itr)[0].second-szStr << ' ' << *itr << endl; } } { //使用迭代器拆分字符串 boost::regex reg("/"); //按/符拆分字符串 boost::cregex_token_iterator itrBegin = make_regex_token_iterator(szStr,reg,-1); //使用-1参数时拆分,使用其它数字时表示取第几个子串,可使用数组取多个串 boost::cregex_token_iterator itrEnd; for(boost::cregex_token_iterator itr=itrBegin; itr!=itrEnd; ++itr) { cout << *itr << endl; } } { //使用迭代器拆分字符串2 boost::regex reg("(.)/(.)"); //取/的前一字符和后一字符(这个字符串形象貌似有点邪恶-_-) int subs[] = {1,2}; // 第一子串和第二子串 boost::cregex_token_iterator itrBegin = make_regex_token_iterator(szStr,reg,subs); //使用-1参数时拆分,使用其它数字时表示取第几个子串,可使用数组取多个串 boost::cregex_token_iterator itrEnd; for(boost::cregex_token_iterator itr=itrBegin; itr!=itrEnd; ++itr) { cout << *itr << endl; } } |
相关文章推荐
- [转载]jquery cookie的用法
- htmlPaser的一些用法收集(转载)
- EasySize用法(转载)
- exec族函数用法(转载)
- [转载]expect spawn、linux expect 用法小记
- EXTJS学习系列基础篇:第六篇(转载)作者殷良胜,Ext组件系列之--button组件的基本用法
- 【转载】synchronized的用法
- C#字符串类的典型用法
- conn.setAutoCommit()用法及作用(转载)
- 转载 sizeof怎样用法
- MySQL的lock tables和unlock tables的用法(转载)
- #ifdef,#else,#endif,#if用法详解(转载)
- bitset常用函数用法记录 (转载)
- (转载)C++new的用法
- nlssort函数的用法以及参数 (转载)
- C#随机函数random()典型用法集锦
- (转载)Linux thread 最基本用法
- 【转载】C++ ofstream和ifstream详细用法
- <转载>java中synchronized用法
- STL容器用法之List(转载)