5

私は C++ 正規表現が初めてで、char* の代わりに文字列で動作させることができません。これまで見てきた例は、常に c 文字列用でした。

ここでは紹介しませんが、実際のプログラムではサブ マッチを使用していますが、動作させることができませんでした。Visual Studio 2010 Ultimate を使用しています。

元の - 作業中の - コード:

const char *first = "abcd"; 
const char *last = first + strlen(first); 
std::cmatch mr; 
std::regex rx("abc"); 
std::regex_constants::match_flag_type fl = std::regex_constants::match_default;

std::cout << "search(f, l, \"abc\") == " << std::boolalpha 
          << regex_search(first, last, mr, rx) << std::endl; 
std::cout << "  matched: \"" << mr.str() << "\"" << std::endl; 

std::cout << "search(\"xabcd\", \"abc\") == " << std::boolalpha
          << regex_search("xabcd", mr, rx) << std::endl; 
std::cout << "  matched: \"" << mr.str() << "\"" << std::endl;

変更されたコード:

const string first = "abcd";     // char * => string
std::smatch mr;                  // cmatch => smatch
std::regex rx(string("abc")); 
std::regex_constants::match_flag_type fl = std::regex_constants::match_default;

               // this works:
std::cout << "search(f, l, \"abc\") == " << std::boolalpha 
          << regex_search(first, mr, rx) << std::endl; 
std::cout << "  matched: \"" << mr.str() << "\"" << std::endl; 

               // after the next line executes mr seems good to me:
               // mr[0] = {3, matched:true, first="abcd", second="d",...}
std::cout << "search(\"xabcd\", \"abc\") == " << std::boolalpha
          << regex_search(string("xabcd"), mr, rx) << std::endl; 
               // but the following line gives the error
               // "Debug assertion failed"
               // Expression: string iterators incompatible
std::cout << "  matched: \"" << mr.str() << "\"" << std::endl;

変更されたコードの一部が機能し、次の部分で例外が発生するのは奇妙です。mr[0].str() を使用しようとしましたが、同じエラー メッセージが表示されました。この問題を解決するのを手伝ってくれませんか?

4

1 に答える 1

10

問題は一時的なものです。

smatch検索する文字列にイテレータが含まれます。

regex_search(string("xabcd"), mr, rx)で死ぬ一時的な文字列を作成します;

そのためmr、次の行で使用するまでに、無効化されたメモリを参照します。はstringより長く存続する必要がありmrます。

于 2012-05-11T14:15:50.093 に答える