2017-05-08 9 views
-1

私はドットで区切られた数字を解析し、各数字をsepate文字列として取得しようとしています。このサンプルでdotでstd :: regexを解析する

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

int main(int argc, char* argv[]) 
{ 
    try 
    { 
     std::string data("123.321.456.654"); 
     std::regex reg(R"(([0-9]+)\.(\1)\.(\1)\.(\1))"); 
     std::smatch m; 
     if (std::regex_match(data, m, reg)) 
     { 
      std::cout << m.size() << std::endl; 
      //std::cout << m[0].str() << std::endl; 
      std::cout << m[1].str() << std::endl; 
      std::cout << m[2].str() << std::endl; 
      std::cout << m[3].str() << std::endl; 
      std::cout << m[4].str() << std::endl; 
     } 
    } 
    catch (const std::exception& e) 
    { 
     std::cerr << "Error occurred: " << e.what() << std::endl; 
    } 

    return EXIT_SUCCESS; 
} 

私は3つの正規表現使用しています:まったく動作しません

std::regex reg(R"(([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+))"); 

作品:

std::regex reg(R"((\d+)\.(\d+)\.(\d+)\.(\d+))"); 

作品をそれは私のサンプルプログラムです。

std::regex reg(R"(([0-9]+)\.(\1)\.(\1)\.(\1))"); 

私の質問は、なぜlast regexが動作していないのか、構文のどこに誤りがあるのですか?ありがとう。

+0

'\ 1'は後方参照であるため、*パターン*を再帰的に呼び出すサブルーチン呼び出しではありません。最初のキャプチャグループでキャプチャした値と一致します。 –

+0

@WiktorStribiżew:回答セクションに回答があります –

+0

これはC++の質問ではなく、正規表現の質問です。あなたの問題を構成部分に分解する習慣に入ってください。 –

答えて

0

エラーは構文にはありません。それはあなたの論理です。

逆参照はパターンを繰り返しません。 they match previously-matched text

したがって、パターンは123.123.123.123と一致します。

関連する問題