<Boost> 正則表達式boost::regex
2014-12-25 15:15
225 查看
1. 編譯boost regex
使用boost庫的regex先需要編譯,方法如下:C:\Users\Administrator>cd "C:\Program Files\boost_1_57_0" C:\Program Files\boost_1_57_0>bootstrap C:\Program Files\boost_1_57_0>.\b2
2. regex的使用
regex是regular expression的縮寫, 即正則表達式。boost庫使用的是Perl正則表達式。使用说明:
1. 创建regex对象:
#include<boost/regex.hpp> boost::regex reg(“(.*)”);
2. regex_match
该函数用来对一个字符串的完全匹配,在很多校验信息中可以广泛使用,具体使用示例见附后的测试代码
3. regex_rearch
说到这个函数,必须要说明下boost.match_result。 regex_rearch在执行查找时,通过一个match_result类型的对象来报告匹配的自表达式。
match_result主要封装了一个std::vector<sub_match<<…>> >类型的对象,而sub_match类继承自std::pair,主要记录匹配的结果信息。
4. regex_replace
该函数根据指定的fmt格式化通过正则表达式匹配的子串。需要注意的是,该函数不会修改原字符串,只是将格式化后的结果返回。具体使用示例见附后测试源码。
5. regex_iterator
通过多次调用regex_rearch我们可以处理所有满足匹配的字串。但是,Regex库还给我们提供了一个更优雅的方法——即通过regex_iterator。通过字符串和正则表达式构造regex_iterator的时候会构建一个match_result的对象用于保存匹配结果信息,再通过重载++运算符达到遍历所有匹配信息的目的。
6. regex_token_iterator
与regex_iterator相似,regex还提供了一个列举与正则表达式不匹配的子表达式,就是regex_token_iterator。与stl的设计类似,是通过迭代器适配器实现的。这个特性让我们很容易的分割字符串。
以下是示例代碼:
#include <boost/lambda/lambda.hpp> #include <boost/regex.hpp> #include <iostream> #include <iterator> #include <algorithm> using std::cout; using std::endl; using namespace std; class regex_callback { public: template <typename T> void operator()(const T& what) { std::cout << what << std::endl; } }; void BoostRegex() { using namespace boost::lambda; ////////////////////////////////////////////////////////////////////////// // regex boost::regex reg("select ([a-zA-Z]*) from ([a-zA-Z]*)"); cout << "Status: " << reg.empty() << endl; // 正則表達式是否有效: 0表示正常 cout << "Mark count: " << reg.mark_count() << endl; // 正則表達式的組數:小括號對數+1 ////////////////////////////////////////////////////////////////////////// // 完全匹配 boost::regex reg1("select ([a-zA-Z]*) from ([a-zA-Z]*)"); boost::cmatch match1; std::string str1 = "select me from dest"; bool bRet = boost::regex_match(str1, reg1); // 只測試匹不匹配,不保存結果 cout << (bRet ? "匹配" : "不匹配") << endl; bRet = boost::regex_match(str1.c_str(), match1, reg1 ); // 測試匹配,並保存結果 std::for_each(match1.begin(), match1.end(), /*std::cout << _1 << " "*/regex_callback()); cout << "-----------------------------" << endl; ////////////////////////////////////////////////////////////////////////// // 部分匹配 boost::cmatch match2; std::string str2 = "my select me from dest oh baby"; bRet = boost::regex_search(str2.c_str(), match2, reg1); cout << match2.prefix() << endl; // 匹配成功部分的前綴字段 cout << match2.suffix() << endl; // 匹配成功部分的後綴字段 std::for_each(match2.begin(), match2.end(), /*std::cout << _1 << " "*/regex_callback()); cout << "-----------------------------" << endl; ////////////////////////////////////////////////////////////////////////// // 替換 boost::regex reg3("(Colo)(u)(r)", boost::regex::icase | boost::regex::perl); // 對大小寫不敏感 std::string str3 = "Colour, colours, color, colourize"; std::string sRslt = boost::regex_replace(str3, reg3, "$1$3"); // (Colo)(u)(r)三部分只取第一部分和第三部分 cout << sRslt << endl; cout << "-----------------------------" << endl; ////////////////////////////////////////////////////////////////////////// // regex_iterator boost::regex reg4("(\\d+),?"); std::string str4 = "1,2,3,4,5,6,7,85,ad2348(,hj"; boost::sregex_iterator it(str4.begin(), str4.end(), reg4); boost::sregex_iterator itend; std::for_each(it, itend, cout << _1 << " "); cout << "\n-----------------------------" << endl; ////////////////////////////////////////////////////////////////////////// // regex_token_iterator 分割字符串 boost::regex reg5("/"); std::string str5 = "Split/Vulue/Teather/Neusoft/Write/By/Lanwei"; boost::sregex_token_iterator tit(str5.begin(), str5.end(), reg5, -1); boost::sregex_token_iterator titend; while (tit != titend) { cout << *tit << " "; tit++; } cout << "\n-----------------------------" << endl; }
其中正則表達式:
"select ([a-zA-Z]*) from ([a-zA-Z]*)":匹配SQL查詢語句, ([a-zA-Z]*)即匹配若干個字母,如: select me from dest, 第一個"([a-zA-Z]*)"匹配"me", 第二個匹配"dest".
"(\d+),?": 搜索字符串中的數字,直到遇到",",(\d+)即匹配若干個數字,"?"在這裏代表非貪婪匹配.
運行效果如下:
相关文章推荐
- folly编译错误boost::re_detail_106100::cpp_regex_traits_implementation<char>::transform解决办法
- <Boost> VS2010使用Boost(C++库)
- 回调函数 typedef bool (*IsUsed)(const string &name,boost::shared_ptr<ShpGeometry> oneGeometry);
- 关于在mac 下面#include<boost/asio.hpp>报错的解决方法
- boost::future<T>::then & Autobahn C++ 内存占用高问题分析:
- boost::scoped_ptr<CUser> apUser(new CUser);
- <Boost> boost::lexical_cast字面转换和gregorian::date日期
- <Boost> smart_ptr智能指针
- boost.asio的跨平台实现 <转>
- boost中类似于 shared_array<int> ptr(0) error
- <Boost> 字符串处理和格式化输出
- 'boost::asio::basic_stream/datagram_socket<Protocol>' error
- boost综合使用<function,bind,thread,mutex,condition_variable,shared_ptr>
- 使用muduo编译链接错误 undefined reference to `muduo::ThreadPool::run(boost::function<void ()()>&&)'
- <Boost> boost::thread 多线程的使用
- 编译boost,源自<Boost程序库完全开发指南>
- [置顶] 从零开始学C++之boost库(一):详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)
- UML参考手册 第三部分 参 考 资 料 第13章 术 语 大 全 <六>
- <<AI入门(6)>>(C)
- 中国人自己的开发工具HB++<面向对象技术>