Форум программистов, компьютерный форум CyberForum.ru

Регулярные выражения (regex) - C++

Восстановить пароль Регистрация
 
Mr. Hat
2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 63
15.03.2013, 06:18     Регулярные выражения (regex) #1
Нужно извлечь строку из переменной класса smatch. Пробовал через преобразование string(smatch_var) и через потоки, и во всех способах оказывается задействована функция str(). Вот текст тестовой программы:

C++
1
2
3
4
5
6
7
8
9
#include <regex>
using namespace std;
 
int main() {
    smatch m;
    if(regex_search(string("asssdf"),m,regex("sss"))) {
        m.str(); //<------ ошибка
    }
}
Конкретно ошибка возникает в файле xutility:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<class _RanIt> inline
    void _Debug_range2(_RanIt _First, _RanIt _Last,
        _Dbfile_t _File, _Dbline_t _Line,
        random_access_iterator_tag)
    { // test iterator pair for valid range, random-access iterators
    if (_First != _Last) //<---------------------------------------- ошибка
        { // check for non-null pointers, valid range
        _DEBUG_POINTER2(_First, _File, _Line);
        _DEBUG_POINTER2(_Last, _File, _Line);
        if (_Last < _First)
            _DEBUG_ERROR2("invalid iterator range", _File, _Line);
        }
    }
Здесь _First и _Last (тип string::const_iterator) имеют значения "sssdf" и "df" соответственно (значения появляются, если в MVS навести курсор на переменную; видимо, это строки, на которые ссылается указатель). Суть сообщения об ошибке: "Expression: string iterators incompatible". Конкретно (если залезть еще глубже) это появляется здесь (файл xstring):

C++
1
2
3
4
5
6
7
8
9
void _Compat(const _Myiter& _Right) const
    { // test for compatible iterator pair
    if (this->_Getcont() == 0
        || this->_Getcont() != _Right._Getcont())
        { // report error
        _DEBUG_ERROR("string iterators incompatible");
        _SCL_SECURE_INVALID_ARGUMENT;
        }
    }
В функцию _Getcont дебаггер заходит только один раз, так что скорее всего выполнено условие this->_Getcont() == 0. Проблема решается с использованием неявного преобразования в string и функции length():

C++
1
2
3
4
5
6
7
8
9
10
11
#include <regex>
#include <iostream>
using namespace std;
 
int main() {
    smatch m;
    string s="asssdf";
    if(regex_search(s,m,regex("sss"))) {
        cout << s.substr(s.find(m[0]),m[0].length()) << endl; // OK
    }
}
Причем во время преобразования используется та же функция str(), но в этот раз функция _Compat не выдает ошибку, хотя значения итераторов те же самые. Почему так происходит?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2013, 06:18     Регулярные выражения (regex)
Посмотрите здесь:

Регулярные выражения C++
С++ и регулярные выражения C++
C++ Регулярные выражения
C++ Регулярные выражения
C++ Регулярные выражения
C++ Регулярные выражения с++
Регулярные выражения C++
C++ Регулярные выражения

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KATbIK
 Аватар для KATbIK
86 / 81 / 10
Регистрация: 02.08.2011
Сообщений: 335
15.03.2013, 07:06     Регулярные выражения (regex) #2
Какой компиль? Говорят что в gcc 4.7 регексы ещё не доделаны(уточни). Под boost все работает.
Yandex
Объявления
15.03.2013, 07:06     Регулярные выражения (regex)
Ответ Создать тему
Опции темы

Текущее время: 18:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru