今天项目中要用到正则表达式。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
#include
#include
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 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);