Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить значение между в std::regex? между двумя значеними 
:(
    Опции темы
manking
Дата 8.11.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 8.11.2011

Репутация: нет
Всего: нет



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

###
text
###


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


 




PM MAIL   Вверх
bsa
Дата 8.11.2011, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



случаем тут триграфы не возникают?
PM   Вверх
manking
Дата 8.11.2011, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 8.11.2011

Репутация: нет
Всего: нет



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

Никогда их не видел вживую.
(?<=[#]{3}) это некомпилируется как регулярное выражение, то есть после запуска exe бросается исключение.
PM MAIL   Вверх
bsa
Дата 8.11.2011, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



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

Это сообщение отредактировал(а) bsa - 8.11.2011, 14:46
PM   Вверх
manking
Дата 8.11.2011, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 8.11.2011

Репутация: нет
Всего: нет



Цитата(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;
   }    




Это сообщение отредактировал(а) manking - 8.11.2011, 15:00
PM MAIL   Вверх
igorrr37
Дата 8.11.2011, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.12.2010

Репутация: нет
Всего: нет



стандарт вроде не поддерживает какие то вещи из регексов, вот так всё работает
Код
#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


Это сообщение отредактировал(а) igorrr37 - 8.11.2011, 15:16
PM MAIL   Вверх
manking
Дата 8.11.2011, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 8.11.2011

Репутация: нет
Всего: нет



Цитата(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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0912 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.