Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.66
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,054
Записей в блоге: 17
#1

std::regex и boost::regex - C++

03.12.2012, 00:16. Просмотров 5513. Ответов 18
Метки нет (Все метки)

Что-то я не пойму что реализация их различна ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
 
//#include <regex>
//using namespace std;
 
#include <boost/regex.hpp>
using namespace boost;
 
 
int main()
{
  regex re(".*?\\..*");
  std::string s="file.txt";
 
  if ( regex_match(s,re) ) std::cout<<"совпало "<<std::endl; 
  else std::cout<<"не совпало "<<std::endl; 
 
return 0;   
}
Компилятор g++ при boost пишит что совпало (как и ожидалось) при std пишит что не совпало, что за разница?

g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2012, 00:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос std::regex и boost::regex (C++):

Регулярное выражение boost::regex - C++
Здравствуйте форумчане. Не получается написать регулярное выражения для разбора такой строки: g=p1#s=p1,p2#t=p1 g, s, t - имена...

Парсер лога с использованием boost::regex - C++
Всем привет. Есть задача пропарсить лог антивирусника с ипользованием boot:: regex, и выдать формат Filename - Diagnosis. Лог не очень...

Std::regex не работает - C++
Здравствуйте, имеется регекс для следущего паттерна: &quot;слово пробел слово newline . Что-то вроде этого: регекс следующий: ...

Ошибка составления std::regex в C++11 - C++
Есть вот такой пример кода: #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;regex&gt; int main() { std::string fnames =...

Есть ли инструкция по использованию std::regex - C++
Есть какой-то мануальчик по использованию сего чуда в c++11? Ну или подскажите как найти в поле string все href вне зависимости от...

Boost::regex не могу сформировать ссылку на паттерн при поиске - C++
Необходимо найти 2 повторяющихся заголовка и объединить некоторое содержимое через replace. Хотел создать выражение для поиска: ...

18
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
03.12.2012, 01:17 #2
Возможно, по умолчанию у них выбран разный синтаксис?
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,054
Записей в блоге: 17
03.12.2012, 01:32  [ТС] #3
Чет не поймуhttp://www.cplusplus.com/reference/regex/ECMAScript/
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
03.12.2012, 01:33 #4
Но там можно выбрать
http://www.cplusplus.com/reference/r...ax_option_type
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
03.12.2012, 02:23 #5
http://www.boost.org/doc/libs/1_52_0...rl_syntax.html
Perl regular expressions are the default behavior in Boost.Regex
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,054
Записей в блоге: 17
03.12.2012, 02:25  [ТС] #6
Ну так про буст то понятно... вопрос больше про новый стандарт...

Походу в него не включили первовские выр-я ?
И придется POSIX смотреть...
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,054
Записей в блоге: 17
26.12.2012, 16:31  [ТС] #7
Никак не могу понять почему код из темы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <windows.h>
 
#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
#include <regex>
 
using namespace std;
//----------------------------------
int main()
{
system("chcp 1251");
 
ifstream ifs("1.txt");
if(!ifs) { cerr<<"file not found"<<endl; return 0; }
 
string s;
string sre= "([[:digit:]]{0,6}),?\\s*(.*?)\\sг,(.*)"; // содержит кириллицу "г"
 
regex re(sre);
smatch m;
 
while (getline(ifs,s) &&  regex_search(s,m,re) )
  {
    cout<<"<"<< m[1] <<">  ["<<m[2]<<"]"<<endl;
  }
    
system("pause");
return 0;
}
Работает в VC++2010 но не работает на компиляторе MinGW ( тот что в подписи у niXman ) + CodeBloks
и не работает под Ubuntu ( но работает если использовать boost вместо std )
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,054
Записей в блоге: 17
26.12.2012, 16:33  [ТС] #8
Под Window вылазиет такое
0
Миниатюры
std::regex и boost::regex  
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
26.12.2012, 17:56 #9
Avazart, Да не реализованы нормально regex еще ни в одном компиляторе. В некоторых просто стоит заглушка, кидающая исключение.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,054
Записей в блоге: 17
26.12.2012, 17:59  [ТС] #10
ForEveR, Пипец ...

Удивительно что в VC++ работает нормально, а g++ ( и MinGW ) нет...
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
26.12.2012, 18:06 #11
Собственно убрав non-greedy repeats все будет работать в С++11. Что кстати довольно странно, ибо non-greedy repeats есть и в ECMAScript Grammar.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,054
Записей в блоге: 17
26.12.2012, 18:08  [ТС] #12
Ну пример http://www.cplusplus.com/reference/regex/regex_search/ с такой же ошибкой
а пример http://www.cplusplus.com/reference/regex/regex_match/ нормально...

( Под Windows )
0
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
26.12.2012, 18:24 #13
Цитата Сообщение от Avazart Посмотреть сообщение
Удивительно что в VC++ работает нормально, а g++ ( и MinGW ) нет...
Почему удивительно?

Опытным путем установил, что ошибка происходит в конструкторе regex. Если идти далее, то доходим до функции _M_atom() (находится в regex_compiller.h MinGW) далее нет времени углубляться - работать пора

Добавлено через 15 минут
Лично у меня в реализации _M_atom
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
      
//... При втором вызове заходит в условие
if (_M_match_token(_ScannerT::_S_token_subexpr_begin))
    {
    
      int __mark = _M_state_store._M_sub_count();
      _StateSeq __r(_M_state_store,
            _M_state_store.
            _M_insert_subexpr_begin(_Start(__mark)));
          //При вызове функции _M_disjunction()(это тут уже сложная рекурсия)
      this->_M_disjunction();
      
      if (!_M_match_token(_ScannerT::_S_token_subexpr_end))
        __throw_regex_error(regex_constants::error_paren);
      if (!_M_stack.empty())
        {
          __r._M_append(_M_stack.top());
          _M_stack.pop();
        }
      __r._M_append(_M_state_store._M_insert_subexpr_end
            (__mark, _End(__mark)));
      _M_stack.push(__r);
      return true;
    }
      return _M_bracket_expression();
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,054
Записей в блоге: 17
26.12.2012, 18:32  [ТС] #14
Цитата Сообщение от Croessmah Посмотреть сообщение
Опытным путем установил, что ошибка происходит в конструкторе regex.
А вывод ? Сюрприз от разработчиков ?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
26.12.2012, 18:36 #15
Цитата Сообщение от Avazart Посмотреть сообщение
А вывод ? Сюрприз от разработчиков ?
Скорее всего, просто где-то что-то еще не до конца реализовано.
0
26.12.2012, 18:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2012, 18:36
Привет! Вот еще темы с ответами:

Вылетает boost::regex в windows forms, в консоли всё нормально - C++
работаю с формой, подключаю &lt;boost/regex.hpp&gt;. Компиляция проходит без ошибок, но когда нажимаю f5 вылетает ошибка: &quot;Debug assertion...

Возможно ли найти расположение подстроки в строке через регулярное выражение std::regex? - C++
Слышал, что C# позволяет с помощью regex определять начало найденной подстроки и её длину. Возможно ли это сделать на C++? Например,...

std::regex : баг на сайте или баг компилятора? - C++
http://en.cppreference.com/w/cpp/regex/regex_match этот код выкидывает throw... Добавлено через 35 секунд компилятор gcc 4.8

std::regex - всегда выдает "NO!" - C++
#include &lt;string&gt; #include &lt;iostream&gt; #include &lt;regex&gt; using namespace std; int main() { string str(&quot;abc&quot;); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru