Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как получить значение между в std::regex?


Автор: manking 8.11.2011, 14:02
Здравстуйте. 
Пытаюсь перейти с использования библиотеки pcre на std::regex которые появились в новом стандарте  С++ из-за отсутствия 64 битной библиотеки pcre.
Но они не поддерживают некоторые элементы из тех что учил еще по фридлу.
например 
в тексте
Код

###
text
###


надо получить то что между ###. 
Раньше я писал что то типа (?<=[#]{3})[^9]+(?=[#]{3}) и это отлично работало. 
А как здесь?
std::regex это posix? 
Не могу найти документацию нормальную 
вот на одном сайте сказано
<b>(.*)</b> - произвольная последовательность символов, заключённых между lt;b> и lt;/b>. 
Но это ничего не находит.
Опережающая проверка (?<=[#]{3}) не компилируется(в самом классе regex).


 




Автор: bsa 8.11.2011, 14:32
случаем тут триграфы не возникают?

Автор: manking 8.11.2011, 14:38
Цитата(bsa @ 8.11.2011,  14:32)
случаем тут триграфы не возникают?

Никогда их не видел вживую.
(?<=[#]{3}) это некомпилируется как регулярное выражение, то есть после запуска exe бросается исключение.

Автор: bsa 8.11.2011, 14:43
manking, попробуй просто вывести на экран эту строку для начала. Совпадает она с исходной или нет?
Кстати, триграфов и диграфов тут нет...

Автор: manking 8.11.2011, 14:55
Цитата(bsa @ 8.11.2011,  14:43)
manking, попробуй просто вывести на экран эту строку для начала. Совпадает она с исходной или нет?
Кстати, триграфов и диграфов тут нет...

Какую строку с текстом или выражение?
Они обе совпадают. Могу даже выложить коды их символов. 



Код

std::string  text;
text = "\
\n###\
\ntext\
\n###\
";
std::cout << "\nтекст=" << text;

std::string exp = "(?<=#{3})[^6]+(?=#{3})";

const std::regex reg(exp);
   const std::sregex_token_iterator end;
   for (std::sregex_token_iterator i(text.begin(), text.end(), reg); i != end;++i)
   {
std::cout << "\n" << *i;
   }    



Автор: igorrr37 8.11.2011, 15:14
стандарт вроде не поддерживает какие то вещи из регексов, вот так всё работает
Код
#include <iostream>
#include <string>
#include <boost/regex.hpp>

int main()
{
   std::string s("###text###");
   boost::smatch res;
   boost::regex reg("(?<=[#]{3})[^9]+(?=[#]{3})");
   if(boost::regex_search(s, res, reg)) std::cout << res[0];
   return 0;
}

выводит text

Автор: manking 8.11.2011, 15:27
Цитата(igorrr37 @ 8.11.2011,  15:14)
стандарт вроде не поддерживает какие то вещи из регексов, вот так всё работает
Код
#include <iostream>
#include <string>
#include <boost/regex.hpp>

int main()
{
   std::string s("###text###");
   boost::smatch res;
   boost::regex reg("(?<=[#]{3})[^9]+(?=[#]{3})");
   if(boost::regex_search(s, res, reg)) std::cout << res[0];
   return 0;
}

выводит text

Да это работает спасибо. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)