2017-11-03 22 views
3

私は文字列の形が" \"one\":\"1\", \"two\":2, \"three\":3, \"two\":22 "です。文字列"two":の後に来るすべての値を抽出しようとしています。つまり、上のケースでは222を抽出します。ここでregex:文字列とコロンの後にintを抽出する

が私の仕事は今のところです:

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

int main() 
{ 
    const std::string str = " \"one\":\"1\", \"two\": 2, \"three\":3, \"two\":22 "; 

    std::regex rgx("\"two\":([0-9]*)"); 
    std::smatch match; 

    std::regex_search(str.begin(), str.end(), match, rgx); 
    std::cout << "match[0] = " << match[0] << '\n'; 
} 

これは出力"two"を与えるので、私の表現rgxは間違っています。私は使用する必要がある正しい形式は何ですか?

編集:コロンとその右に来るものの間に空白はありません。

+0

まず: 'RGX( "\" 2 \ ":([0-9] *)")'これはあなたが持っている空白を見つけることができません「2:」と「2」の間にある。 – DimChtz

+0

@DimChtzありがとう、それは私の一部のエラーだった - 空白ではないと思う。 – N08

+0

これを試してみてください: 'std :: regex rgx(" \ "two \" :(。?) ");'残念ながら、今はテストできません。 – DimChtz

答えて

2

正規表現が正しいです。グループ1の値(match[1])を取得してください。すべての試合を得るにはsregex_iteratorを使用してください。 regex_searchは、あなたに1つの(最初の)マッチをフェッチするだけです。

あなたは

#include <string> 
#include <vector> 
#include <iostream> 
#include <regex> 
using namespace std; 

int main() { 
    std::regex r("\"two\":([0-9]*)"); 
    std::vector<int> results; 
    std::string s = " \"one\":\"1\", \"two\":2, \"three\":3, \"two\":22 "; 
    for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r); 
      i != std::sregex_iterator(); 
      ++i) 
    { 
     std::smatch m = *i; 
     results.push_back(std::stoi(m[1].str().c_str())); 
    } 
    for (auto n: results) 
     std::cout << n << std::endl; 
    return 0; 
} 

C++ demoを参照してください使用することができます。

文字列をstd::stoi(m[1].str().c_str())(つまりwhat .c_str() does)の整数に変換するときは、char配列へのポインタを取得する必要があることに注意してください。

+0

値 'm [1]を整数に変換して、例えば' std :: vector 'のように挿入するにはどうしたらいいですか? 'std :: stoi(m [1] .str())'で試してみましたが、これは 'stoi'への呼び出しに' invalid_argument'を与えます – N08

+1

@ N08:変換された文字列を数値にプッシュする方法ですベクターへ](https://ideone.com/FFZLD1)。 –

1

もそれをこのように書くことができる:すべての

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

int main() 
{ 

    std::string s = " \"one\":\"1\", \"two\":2, \"two\":44, \"three\":3, \"two\":22 "; 

    for (std::smatch m; std::regex_search(s, m, std::regex("\"two\":(\\d+)")); s = m.suffix()) 
    { 
     std::cout << m[1] << std::endl; 
    } 

    return 0; 
} 
関連する問題