现在的位置: 首页 > 综合 > 正文

vs2008 tr1 正则表达式 找出所有匹配项

2017年12月11日 ⁄ 综合 ⁄ 共 1981字 ⁄ 字号 评论关闭

今天项目中要用到正则表达式。c++选择的正则表达式解决方案有如下几个

1.ATL 中自带的CAtlRegExp

2.boost的 regex库

3.PCRE

4.c++ tr1 


    CAtlRegExp没有被包含在vs2008中,它已经做为了一个独立的开源项目,独立了。要想用,

还得下载开源库。麻烦,听说还慢。 不考虑使用它。

    要想使用boost的regex库,还得编译它。编译完还得添加项目工程中。不想用。

PCRE据说很牛,PHP,WebKit,Apache...都用它。可是杀鸡焉用牛刀。我只想检查坐标点中的浮

点数。没有发现tr1时,我根本不关心c++ 0x。我以为c++ 0x仅仅是添加语法,现在的c++语法就够

多的了,不想着怎么简化,还有添新语法,还闲c++不够复杂么?后来才发现,c++ 0x也干了些好事

。c++ 0x接受了c++
Technical Report 1
 ,简称tr1。它包含正则表达式,随机数生成器,tuple,ha

sh tables。vs2008 sp1已经实现了tr1。所以我使用了这个方法。


实例代码如下,编译环境vs2009+sp1, xp

#include <regex>  
#include <string>  
#include <iostream>

void PrintResult(std::tr1::cmatch & res)
{
	for (size_t i = 0; i < res.size(); ++i)
	{
		std::cout << res[i] << std::endl;
	}
}

int main(int argc, char* argv[])
{
	std::string str;
	std::tr1::cmatch res1;

	str = "010-69874569123";
	//std::tr1::regex rx("0\d{2}-\d{8}");
	//含义:以0开头后面有两个数字,加上一个"-"再接8个数字
	std::tr1::regex rx("0\\d{2}-\\d{8}"); 
	std::tr1::regex_search(str.c_str(), res1, rx);
	PrintResult(res1);
	//vaild //0.36 //.98 // 98 // -0.36 //-.98 // -98
	//invaild "..98" u87
	str = "-98";
	//开头有“-”或没有“-”,后面接数字,数字的位数可以是0到n个
	//小数点至多有一个,小数点后至少有一个数字
	//即检查是否是浮点数
	rx ="^-?\\d*\\.?\\d+$";
	std::tr1::cmatch res2;
	std::tr1::regex_search(str.c_str(), res2, rx);
	PrintResult(res2);
	std::cin.get();
	return 0;
}

注意

rx ="^-?\\d*\\.?\\d+$";

csdn贴代码出错了。


如果使用regex_search,只能搜出要一个匹配项。使用regex_token_iterator搜出所有匹配项。

例子如下

//函数功能:从字符串中得到点的坐标
//注意:字符串格式为:"浮点数" + "," + "浮点数",
bool GetXY(std::string coordStr)
{
	using namespace std;
	tr1::cmatch res;
	tr1::regex rx("^-?\\d*\\.?\\d+,-?\\d*\\.?\\d+$");
	tr1::regex_search(coordStr.c_str(), res, rx);
	if (res.empty())
	{
		return false;
	}
	
	//typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
	tr1::regex rxFloat("-?\\d*\\.?\\d+");
	tr1::sregex_token_iterator ite(coordStr.begin(), coordStr.end(), rxFloat), end;
	
	for ( ; ite != end; ++ite)
	{
		cout << ite->str() << endl;
	}

	return true;
}

//////////////////////////////////////////////////////////输入内容为正整数/////////////////////////////////////////////////////

const char * textChanged = "163";
std::tr1::regex rx("^[1-9]\\d*$"); //正整数正则表达式
std::tr1::cmatch result;
//为真是字符串为正整数
bool b = std::tr1::regex_search(textChanged, result, rx);






抱歉!评论已关闭.