9

古いスタイルのポインターと長さが与えられた場合、最初にバッファーの内容をにコピーせずにそれconst char *を呼び出す方法はありますか? これが私が抱えている問題の簡単な例です:std::regex_search()std::string

#include <regex>

int main()
{
    const char *text = "123 foobar 456";
    const size_t len = strlen(text);

    const std::regex rx(" (.+)bar");

    std::smatch what;
    std::regex_search( text, text+len, what, rx); // <- problematic line

    return 0;
}

2 つの反復子を必要とする 5 番目のstd::regex_search()が必要だと思いましたが、ポインターを反復子に変換する方法を完全には理解していません。上記のコードをコンパイルしようとすると、次のようになります。

g++ -std=c++11 test.cpp
test.cpp:11:45: error: no matching function for call to ‘regex_search(const char*&, const char*, std::smatch&, const regex&)’
/usr/include/c++/4.9/bits/regex.h:2131:5: note: template<class _Bi_iter, class _Alloc, class _Ch_type, class _Rx_traits> bool std::regex_search(_Bi_iter, _Bi_iter, std::match_results<_BiIter, _Alloc>&, const std::basic_regex<_CharT, _TraitsT>&, std::regex_constants::match_flag_type)
 regex_search(_Bi_iter __s, _Bi_iter __e,

...そしてさらに多くのエラー!

const char *必要なイテレータに変換できますか? 私はそれを間違っていましたか?これがどのように機能するかを誤解していますか?

4

1 に答える 1

13

コードのエラーは、間違ったmatch_results型を使用していることです。オブジェクトがあり、関数に s を渡すsmatchときに使用することになっています。代わりにraw s を使用する場合。std::stringstd::string::iteratorregexchar const *cmatch

変化する

std::smatch what;

std::cmatch what;

ライブデモ

于 2015-01-19T06:25:32.110 に答える