Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: вопрос по конвертации QRegExp в std::regex  (Прочитано 4830 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 15-02-2017 08:00 » 

был написан код на Qt, где использовался класс QRegExp, потребовалось повторить то же самое в проекте на MFC в студии (2008). Я нашёл класс regex, правда нашёл не сразу, потому что он тут в области std::tr1 , а не просто в std . Нашёл, но не пойму, как повторить фишку с захватом групп, как в QRegExp

Например, в Qt отмеченные группы чётко вытаскиваются:

Код: (C++)
QRegExp rx(".*(a).*(b).*");

if(-1 != rx.indexIn("111a222b333",0) )
{
        QStringList texts=rx.capturedTexts();
        //texts[0]=="111a222b333" - тут всегда вся совпавшая строка
        //texts[1]=="a" - тут первая группа
        //texts[2]=="b" - вторая группа
}

а с regex

Код: (C++)
#include <regex>
...
std::tr1::regex rx(".*(a).*(b).*");
std::tr1::smatch m;
std::string s="111a222b333";

std::tr1::sregex_iterator it(s.begin(),s.end(),rx);
for(; it!=std::tr1::sregex_iterator(); it++)
{
        std::string gr=it->str();
        //gr==111a222b333
}

то есть итератор перечислит найденные в строке совпадения и всё. Никаких тебе групп. Получается, нужно будет в полном совпадении ещё парочкой поисков вытаскивать нужные значения ?  Или я что-то пропустил и возможность захвата есть ?
« Последнее редактирование: 15-02-2017 08:33 от Алексей++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 15-02-2017 08:29 » 

разобрался  Внимание! Говорит и показывает...

Код: (C++)
std::tr1::regex rx(".*(a).*(b).*");  
std::tr1::cmatch m;  
//std::tr1::smatch m; - если в regex_search нужно передавать std::string&, а не const char*

std::tr1::regex_search("111a222b333", m, rx);  

if(m.size()>2) // 2 - ожидаемое количество групп
{
        std::string s0(m[0].first,m[0].second);//111a222b333
        std::string s1(m[1].first,m[1].second);//a
        std::string s2(m[2].first,m[2].second);//b
}
« Последнее редактирование: 15-02-2017 08:32 от Алексей++ » Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines