2016-09-20 8 views
0

誰かが私には、以下の出力では、なぜこのコードの結果を説明していただけます。C++ 11 regex_replaceの奇妙な行動

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

using namespace std; 

int main(void) { 
    std::string test_string("foo.bar.baz.<name>:<value>|@<rate>|#tag:<tag>"); 

    if (std::regex_match(test_string, std::regex(".*(<name>).*"))) { 
     std::cout << "MATCH!" << std::endl; 
    } else { 
     std::cout << "NO MATCH!" << std::endl; 
    } 

    test_string = std::regex_replace(test_string, std::regex(".*(<name>).*"), "master"); 
    std::cout << test_string << std::endl; 
    return 0; 
} 

出力:

[[email protected] tmp]# ./test 
MATCH! 
master 

をランタイムが壊れているように私には思えます。下のページでregexを検索したが、何も実装されていません。

https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011

答えて

0

regex_replaceは、その引数を変更しない、それは新しい文字列を返します。試してみてください:

test_string = std::regex_replace(test_string, std::regex(".*(<name>).*"), "master"); 
+0

それは文字列全体を殺す:[ルート@ 0be8f48dd8d3 /]#./テスト マッチ! master – ladaManiak

+1

まあ、 "何か、次に、次に何か"、 "master"と置き換えるように指示します。 ""を置き換えたい場合は、それだけを正規表現として使用してください。 C++には "このサブマッチのみを置き換える"機能はありません。 –

+0

良い点。私は、regex_replaceが文字列を置換するために一致を使用することを混乱させました。今は理にかなっている。ありがとう! – ladaManiak