2016-11-02 5 views
2

でのapperanceのために一度だけの部分式を保持し、私は次のコードを持っている:は、C++のstd ::正規表現、smatchは、パターン文字列

int main() 
    { 
     regex reg_expr("(\\([A-Z],[A-Z]\\))(?:\\s(\\([A-Z],[A-Z]\\)))*"); 
     //regex reg_expr("(\\([A-Z],[A-Z]\\))(?:\\s(\\([A-Z],[A-Z]\\)))*\\s(\\([A-Z],[A-Z]\\))"); 
     smatch sm; 
     string input("(A,B) (C,D) (F,W) (G,K) (R,M)"); 
     //string input("(A,B) (C,D) (F,W)"); 
     if (regex_match(input, sm, reg_expr)) { 
      cout << "true\n"; 
      cout << sm.size() << "\n"; 
      for (int i = 0; i < sm.size(); i++) { 
       //if (sm[i].length()) 
        cout << "submatch number " << i << ": " << sm[i].str() << '\n'; 
      } 
     } else 
      cout << "false"; 
    return 0; 
    } 

すべてが「smatch SM」は各部分式のための唯一の部分文字列を持っていることを除いて正常に動作します正規表現の文字列で指定します。 たとえば、次のテスト文字列のために:

(A,B) (C,D) (F,W) (G,K) (R,M) 

正しく

(\([A-Z],[A-Z]\))(?:\s(\([A-Z],[A-Z]\)))* 

正規表現と照合され、「SMは」唯一の木の部分文字列を持っている:1は、文字列全体のためであり、 「(C、D)」、「(F、W)」、「(G、K)」は欠落しているが、一致している(「(A、B)」と「(R、M) 。

(?:\s(\([A-Z],[A-Z]\)))*は正規表現によって0個以上の部分式が一致するはずですが、std::smatch smには1つの部分式しか格納されないというエラーがあるようです。
ライブラリーのエラー(これはあまりありません)か、私は何か間違っていますか?あなたの助けと助言はうまくいっています!

+0

これはキャプチャの仕組みではありません。獲得されたグループ値ではなく、複数の一致*を収集するには、正規表現イテレータで簡単な 'R '(\([A-Z]、[A-Z] \))' 'を使用する必要があります。 –

答えて

2

PyPy Python regexモジュール、.NET、適切なオプションでコンパイルされた場合はBoost)を除いて、バグではありませんが、繰り返しのキャプチャで最後に一致した項目だけがバッファに格納されます。

詳細については、Repeating a Capturing Group vs. Capturing a Repeated Groupの記事をご覧ください。あなたのケースでは

、あなたは定期的にstd::sregex_iteratorを使用することがあります。

int main() { 
    std::regex reg_expr(R"(\([A-Z],[A-Z]\))"); 
    string input("(A,B) (C,D) (F,W) (G,K) (R,M)"); 
    for(std::sregex_iterator i = std::sregex_iterator(input.begin(), input.end(), reg_expr); 
     i != std::sregex_iterator(); 
     ++i) 
    { 
     std::cout << (*i).str() << std::endl; 
    } 
    return 0; 
} 

私は生の文字列にのみ1つのバックスラッシュは正規表現のメタ文字をエスケープするために必要とされるリテラルR"(...)"を使用していますC++ demo

注を参照してください。

関連する問題