LINUX.ORG.RU

[boost.regexp] Непонятки


0

0

Пытаюсь распарсить текст html страницы
Там есть такая строчка:
#<a href="showpost.php?s=45d6c47abb1c9ac666f70fedbd3a3d40&amp;p=1497483&amp;postcou nt=3671"target="new">
подобных строк много postcount=3672, postcount=3673 и.т.д
вот надо вытащить числа после postcount=
пишу так
boost::smatch xResults;
bool r2 = boost::regex_search(responseString, xResults, boost::regex( "postcount=(.*)\"" ), boost::match_default);
В xResults[1] записывается вобще не то что мне нужно(там чуть ли не пол страницы пишется)
Почему так?
Еще проверял регспес в проверялки которая шла в примерах Qt (назвазывает QRegExp) там если эта в качестве исходной строчи указать только эту строчку то регйспейс работает как надо, т.е. вытаскивается это число, если запихнуть весь код страницы то такая же фигня.
Еще есть чекбокс, называется minimal вот если его отметить то вытаскивается как раз то что нужно.

Надо как то регйспейс составить по другому, или с флагами что то не то?
Цель вытащить все числа на страницы после postcount.


Ответ на: комментарий от mipt_student

>> boost::regex("postcount=(\d+)") то что нужно.

Но теперь не могу понять почему в xResults записывается только первое вхождение. я думал что xResults[1] будет первое соответствие в xResult[2] второе и.т.д. А он записывает только первое число в xResults[1] и дальше не ищет.

n4ela
() автор топика

вариант (.*?)\" будет немного пошустрее .

Anoxemian ★★★★★
()
Ответ на: комментарий от Sectoid

> Документацию читать пробовал?

Пробовал и при использование regex_match не чего не работает, т.е. regex_match возвращает значение false хотя при том же регйспейсе но regex_search возвращается true

Я сейчас сделал кое как, но с ОЧЕНЬ большим костылем

std::vector<std::string> preg_match_all(const std::string & s, const boost::regex & expr)
{
typedef boost::regex_iterator<std::string::const_iterator> iter;
std::vector<std::string> res;
transform
(
iter(s.begin(), s.end(), expr),
iter(),
back_inserter(res),
bind(&iter::value_type::str, _1, 0)
);
return res;
}

temp = preg_match_all(responseString, boost::regex( "postcount=(.*?)\"" ));
for ( int s = 0; s < temp.size(); s++ )
temp[s] = boost::regex_replace(temp[s], boost::regex( "postcount=|\"" ), "", boost::match_default);

n4ela
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.