Я забываю регулярные выражения быстрее, чем день рождения моей мамы. Это главная ПИТА. Во всяком случае, я хотел 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, который приводит к чистому вектору токена (без повторения, т. Е. Я не хочу, чтобы вложенная группа пыталась удалить пробелы).
Я знаю, что это не правильный инструмент для работы, дух / lexx или boost::tokenise лучше всего, и я знаю, что это неправильный способ сделать это. в .net при очистке экрана я находил токены в тексте, многократно применяя регулярное выражение к телу, пока не закончатся токены.