2016-11-03 9 views
-1

常にアンダースコアで始まり、末尾にある一連の固有シーケンスが含まれています。私はこれらのシーケンス間の文字列の一部を返す正規表現を探しています。私は、最初の2つのアンダースコアの間にあるすべてのキャプチャグループを作ろうとしました。そして、その間にいくつかの文字があり、最後に、最初のキャプチャグループに一致させようとします。しかし、それは何も一致していません:始まる文字列と同じシーケンスで終わる文字列に一致する正規表現

std::string s = "somerandomstuff_UNIQUESEQUENCE_somemorethings_UNIQUESEQUENCE_morewords" 
std::regex seq("_(.*)_.*_$1_", std::regex_constants::extended); 
std::smatch m{}; 
std::regex_search(s, m, seq); 

問題は、私は順序が何であるかを知らないということです、私はそうでない場合は、これが解決することはかなり簡単だろう(彼らが開始することを知っていて、アンダースコアで終わります... )。誰かがこれのための正規表現を知っていますか?

+1

私はC++ 11 std :: regexの癖を知らないので、これはうまくいくとは思えませんが、 ''(_ [^ _] + _ )(。*?)\\ 1 "'。それが動作すれば、 'somemorethings'はグループ2と一致します。 – zwol

+0

期待される出力は何ですか? –

答えて

1

問題は、.*が貪欲であることです。つまり、UNIQUESEQUENCE_somemorethings_UNIQUESEQUENCEと一致し、正規表現全体が一致しなくなります。

解決策は実際には非常に簡単です。ユニークエッセンスは最初の_で終わるので、それにマッチしないでください。正規表現を使用して:

_([^_]*)_.*_$1_ 
関連する問題