crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Распарсить строку., что посоветуете?
Гость_Гость_*
сообщение 28.11.2007, 12:01
Сообщение #1





Гости








    


Нужно распарсить стороки вида: текст1:текст2@текст3#текст4:текст5@текст6#...#текстN:текстN+1@текстN+2.
Все это нужно для того, чтобы потом разбросать по столбцам в табличке
Вот такое извращение. :)

Как это покрасивее сделать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 28.11.2007, 12:13
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Цитата(Гость @ 28.11.2007, 13:01) *
Нужно распарсить стороки вида: текст1:текст2@текст3#текст4:текст5@текст6#...#текстN:текстN+1@текстN+2.
Все это нужно для того, чтобы потом разбросать по столбцам в табличке
Вот такое извращение. :)

Как это покрасивее сделать?

А как это должно выглядеть в таблице - т.е. что здесь строка,а что - столбец?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 28.11.2007, 12:21
Сообщение #3





Гости








    


Так:
текст1 текст2 текст3
текст4 текст5 текст6
...
текстN текстN+1 текстN+2
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 28.11.2007, 13:20
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Можно разбить сначала QString::split, потом использовать регулярные выражения:
    QString sz = "text1:text2@text3#text4:text5@text6#text7:text8@text9#textN:textN+1@textN+2";
    QStringList strlist = sz.split( "#");
    QStringList::iterator pIter;
    for( pIter = strlist.begin(); pIter != strlist.end(); pIter++)
    {
        QRegExp rx( "(.*):(.*)@(.*)");
        int pos1 = rx.indexIn( *pIter);
        if (pos1 > -1)
        {
            QString sz1 = rx.cap( 1);
            QString sz2 = rx.cap( 2);
            QString sz3 = rx.cap( 3);
            qDebug( "%s\t%s\t%s", qPrintable( sz1), qPrintable( sz2), qPrintable( sz3));
        }
    }
Так пойдет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 28.11.2007, 13:37
Сообщение #5





Гости








    


Спасибо, пойдет. Думаю, что красивше не сделать. А может и сделает кто, я не смог. :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 28.11.2007, 13:47
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Цитата(Гость @ 28.11.2007, 14:37) *
Спасибо, пойдет. Думаю, что красивше не сделать. А может и сделает кто, я не смог. :(

ешшо вариант :)
int split(std::string str, char* delimeters, std::vector< std::string >& tokens)
{
    std::string::size_type endIdx;
    std::string::size_type begIdx = str.find_first_not_of(delimeters);

    while (begIdx != std::string::npos)
    {
        endIdx = str.find_first_of (delimeters, begIdx);
        if (endIdx == std::string::npos)
        {
            endIdx = str.length();
        }

        tokens.push_back(str.substr(begIdx, endIdx - begIdx));
        std::cout<<str.substr(begIdx, endIdx - begIdx)<<std::endl;

        begIdx = str.find_first_not_of (delimeters, endIdx);
    }
    
    return 0;
}

int main() {
    std::string to_parse = "текст1:текст2@текст3#текст4:текст5@текст6";
    std::vector< std::string > result;
    split(to_parse, ":@#", result);
    return 0;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 7.2.2025, 7:26