vs 2008 tr 1正規表現すべての一致を見つける

3050 ワード

今日のプロジェクトでは正規表現が使用されます.c++選択の正規表現ソリューションは次のとおりです.
1.ATLに付属のCAtlRegExp
2.boostのregexライブラリ
3.PCRE
4.c++ tr1 
CAtlRegExpはvs 2008に含まれておらず、独立したオープンソースプロジェクトとして独立しています.使いたいなら、
オープンソースライブラリもダウンロードしなければなりません.すみません、まだ遅いそうです.使用を考慮しません.
boostのregexライブラリを使用するには、コンパイルする必要があります.コンパイルが完了したら、プロジェクトプロジェクトを追加する必要があります.使いたくない.
PCREはすごいそうですが、PHP、WebKit、Apache...すべてそれを使います.しかし、鶏を殺すには牛刀を使うしかない.座標点のフロートをチェックしたいだけです
ポイント数.tr 1が見つからなかったとき、私はc++0 xに全然関心を持っていませんでした.c++0 xは文法を追加するだけで、今のc++文法で十分だと思います.
多くなって、どのように簡略化することを考えないで、また新しい文法を追加して、まだ暇なc++は複雑ではありませんか?後で気づいたのですが、c++0 xもいいことをしました.
.c++0 xはc++Technical Report 1,略称tr 1を受け入れた.正規表現、乱数ジェネレータ、tuple、haが含まれています
sh tables.vs 2008 sp 1はtr 1を実現した.だから私はこの方法を使いました.
インスタンスコードは、コンパイル環境vs 2009+sp 1,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、一致するアイテムは1つしか見つかりません.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<: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);