Я забываю регулярные выражения быстрее, чем день рождения моей мамы. Это главная пита. В любом случае, я хотел получить RE для разбора строки состояния ответа HTTP и правильного захвата подэлементов. Я получил это работает:
const boost::regex status_line("HTTP/(\\d+?)\\.(\\d+?) (\\d+?) (.*)\r\n");
std::string status_test1("HTTP/1.1 200 hassan ali\r\n");
boost::smatch what;
std::cout << regex_match(status_test1,what, status_line, boost::match_extra) << std::endl;
std::cout << what.size() << std::endl;
BOOST_FOREACH(std::string s, what)
{
std::cout << s << std::endl;
}
4-я группа захвата - это то, о чем я суетился, в частности, отмечая слова. Но мне это не нужно, поэтому моя работа выполнена. Тем не менее, я все еще хотел бы знать, как маркировать предложение, разделенное пробелами и заканчивающееся символом '\ 0', что приводит к вектору / массиву слов с разделителями.
Я не могу заставить работать следующий фрагмент
const boost::regex sentence_re("(.+?)( (.+?))*");
boost::smatch sentence_what;
std::string sentence("hassan ali syed ");
std::cout << boost::regex_match(sentence,sentence_what,sentence_re, boost::match_extra) << std::endl;
BOOST_FOREACH(std::string s, sentence_what)
{
std::cout << s << std::endl;
}
он не должен совпадать с "hassan ali syed "
, но должен совпадать с "hassan ali syed"
, и группа захвата должна выводить hassan
ali
syed
(с символами новой строки), но выводит hassan
syed
syed
(обратите внимание, пробел в третьем syed <space>syed
. Я полагаю, группы захвата не могут иметь дело с рекурсивными сущностями?
Итак, есть ли чистый способ указать задачу токенизации в синтаксисе PCRE, которая приводит к чистому вектору токена (без повторения - т.е. я не хочу, чтобы вложенная группа пыталась удалить пробел).
Я знаю, что это не правильный инструмент для работы, Spirit / lexx или boost :: tokenise лучше, и я знаю, что это неправильный способ сделать это. в .net при очистке экрана я мог бы найти токены в теле текста, неоднократно применяя регулярное выражение к телу, пока оно не заканчивалось токенами.