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