您的位置:首页 > 其它

<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+)即匹配若干個數字,"?"在這裏代表非貪婪匹配.

運行效果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: