2017-11-15 24 views
2

私は正規表現をC++ 11で使用しようとしていますが、コードでは常にstd::regex_errorInvalid special open parenthesis.です。文字列内の最初の重複文字を見つけようとする最小限のコード例:無効な特殊なかっこで正規表現マッチングが失敗する

std::string regexp_string("(?P<a>[a-z])(?P=a)"); // Nothing to be escaped here, right? 
std::regex regexp_to_match(regexp_string); 
std::string target("abbab"); 
std::smatch matched_regexp; 
std::regex_match(target, matched_regexp, regexp_to_match); 
for(const auto& m: matched_regexp) 
{ 
    std::cout << m << std::endl; 
} 

は、なぜ私はエラーを取得するか、どのように私はこの例を修正するのですか?

答えて

0

2つの問題はここにあります

  • std::regex味が取り込むという名前のグループ/後方参照をサポートしていない、あなたは
  • キャプチャグループ/後方参照を使用する必要がありますがregex_searchはなくregex_matchrequires a full string matchそれを使用する必要があります。

使用

std::string regexp_string(R"(([a-z])\1)"); 
std::regex regexp_to_match(regexp_string); 
std::string target("abbab"); 
std::smatch matched_regexp; 
if (std::regex_search(target, matched_regexp, regexp_to_match)) { 
    std::cout << matched_regexp.str() << std::endl; 
} 
// => bb 

C++ demo

R"(([a-z])\1)"生の文字列リテラルを参照してくださいには、任意の小文字のASCII文字に一致して、再度同じ文字にマッチする正規表現([a-z])\1を定義します。

0

http://en.cppreference.com/w/cpp/regex/ecmascriptによれば、ECMAScript(デフォルトのタイプはstd::regex)は、肯定先読みの場合には(?=が必要です。

+0

私は、その後の例を修正する方法を教えてもらえますか?私の目標はキャプチャグループにラベルを付けることです –

+0

何をキャプチャするグループですか?あなたは ''(a [z])(a) ''または何か必要ですか? – bipll

+0

再集計パターンを見つける必要があるので、特定のキャプチャグループラベルに対して同じ文字だけをキャプチャするグループを作成したいと考えています。 –

0

regexがクラッシュする理由は、std :: regexでサポートされていない名前付きグループが原因です。あなたはまだ、文字列の最初の文字の重複を見つけることが利用可能なものを使用することができますしかし:

#include <iostream> 
#include <regex> 

int main() 
{ 
    std::string s = "abc def cde"; 
    std::smatch m; 
    std::regex r("(\\w).*?(?=\\1)"); 

    if (std::regex_search(s, m, r)) 
     std::cout << m[1] << std::endl; 

    return 0; 
} 

プリント

c