Поместите первое совпадение 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 и какие параметры у него должны быть?


person Tomáš Zato - Reinstate Monica    schedule 21.03.2013    source источник
comment
Можете ли вы включить пример строки?   -  person eandersson    schedule 22.03.2013
comment
Моя проблема не в том, чтобы сопоставить событие, а в том, чтобы получить результаты совпадения. Так что строка не имеет значения. Я все равно включу.   -  person Tomáš Zato - Reinstate Monica    schedule 22.03.2013
comment
Конечно, но если вы измените регулярное выражение на (?<=<(From )?)([A-Za-z0-9_]+)(?=>(.*?)), вам не нужно об этом заботиться.   -  person eandersson    schedule 22.03.2013


Ответы (2)


Я думаю, что вам не хватает того, что 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 (...)
}
person Dave S    schedule 21.03.2013

Вы можете сделать что-то вроде этого:

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 (...)

Обратите внимание, что регулярное выражение является частью С++ 11, поэтому вам не нужно повышать его, если только ваше регулярное выражение не является сложным (поскольку в С++ 11 и новее все еще возникают трудности с обработкой сложных регулярных выражений).

person Loghorn    schedule 21.03.2013