将第一个boost :: regex匹配放入一个字符串中

时间:2013-03-21 20:59:14

标签: c++ stdstring boost-regex

不知怎的,我没有找到,如何只将第一次出现或正则表达式放到字符串中。我可以创建一个正则表达式对象:

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以及它应该采用什么参数?

2 个答案:

答案 0 :(得分:5)

您可以这样做:

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和更新版本仍然难以处理复杂的正则表达式),所以你不需要对它进行提升。

答案 1 :(得分:2)

我认为你缺少的是boost::regex是正则表达式,但它没有对给定的输入进行解析。您需要将它实际用作boost::regex_searchboost::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 (...)
}