3

どういうわけか、最初の出現または正規表現のみを文字列に配置する方法を見つけることができませんでした。正規表現オブジェクトを作成できます:

static const boost::regex e("<(From )?([A-Za-z0-9_]+)>(.*?)"); 

今、私はに一致([A-Za-z0-9_]+)する必要があります、std::stringと言いplayernameます。

std::string chat_input("<Darker> Hello");
std::string playername = e.some_match_method(chat_input, 1);   //Get contents of the second (...)

私は何を逃しましたか?
代わりに何をすべきでsome_match_method、どのパラメータをとるべきですか?

4

2 に答える 2

6

あなたはこのようなことをすることができます:

static const regex e("<(From )?([A-Za-z0-9_]+)>(.*?)");
string chat_input("<Darker> Hello");
smatch mr;
if (regex_search(begin(chat_input), end(chat_input), mr, e)
    string playername = mr[2].str();   //Get contents of the second (...)

正規表現はC++11の一部であるため、正規表現が複雑でない限り、ブーストは必要ありません(C ++ 11以降では複雑な正規表現の処理が難しいため)。

于 2013-03-21T21:22:49.607 に答える
4

あなたが見逃しているboost::regexのは正規表現だと思いますが、それは与えられた入力に対して解析を行いません。正規表現に対して文字列(またはイテレータペア)を評価するboost::regex_searchまたはへのパラメータとして実際に使用する必要があります。boost::regex_match

static const boost::regex e("<(From )?([A-Za-z0-9_]+)>(.*?)"); 
std::string chat_input("<Darker> Hello");
boost::match_results<std::string::const_iterator> results;
if (boost::regex_match(chat_input, results, e))
{
     std::string playername = results[2];  //Get contents of the second (...)
}
于 2013-03-21T21:11:11.587 に答える