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
に注意
rx ="^-?\\d*\\.?\\d+$";
csdn貼り付けコードが間違っています.
regex_を使用する場合search、一致するアイテムは1つしか見つかりません.regex_の使用token_iteratorはすべての一致を検出します.
例は以下の通り
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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);