Поставете първото съвпадение на 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 (...)

Моля, обърнете внимание, че регулярният израз е част от C++11, така че не се нуждаете от усилване за него, освен ако регулярният ви израз не е сложен (тъй като C++11 и по-новите все още имат затруднения при обработката на сложни регулярни изрази).

person Loghorn    schedule 21.03.2013