2016-11-18 1 views
3

C++ 11 RegExに少し問題があります。私はgreedynesについて考えています。C++ 11 RegEx、non-greedy

ここは少しサンプルです。

#include <stdio.h> 
#include <string> 
#include <regex> 

int main (void) 
{ 
    std::string in="{ab}{cd}[ef]{gh}[ij][kl]"; // the input-string 

    std::regex rx1 ("(\\{.+?})(.*)", std::regex::extended);  // non-greedy? 
    std::smatch match; 

    if (regex_match (in, match, rx1)) 
    { 
    printf ("\n%s\n", match.str(1).c_str()); 
    } 

    return 0; 
} 

私は、出力のための

{ab} 

を期待します。 は、しかし、私は欲張りではなくて、私はそれを行う場合、私は、私が得る結果を期待する

{ab}{cd}[ef]{gh} 

を得ましたか。 +。 それは貪欲ではないでしょうか?

私の考えではどういう問題がありますか? 助けてくれてありがとう!

あなたはstd::regex::extendedを削除する必要がクリス

+0

は、なぜあなたはしかし、あなたは右中括弧をエスケープしていない '\\ {'で開く中括弧をエスケープしますか? – Bobulous

+0

@Bobulousこれは前のパターンを繰り返すのを助ける正規表現の特殊文字です。 –

+1

'std :: regex :: extended'を使用しないでください。regex POSIX EREに準拠し、遅延量指定子をサポートしません。 –

答えて

2

、それはあなたの正規表現POSIX ERE準拠になり、その正規表現の風味は怠惰な量指定子をサポートしていません。

std::regex rx1("(\\{.+?})(.*)"); 

C++ demo