Russian Qt Forum
Ноябрь 27, 2024, 08:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Считывание из QString  (Прочитано 4468 раз)
olympian
Гость
« : Сентябрь 30, 2010, 23:23 »

Здравствуйте уважаемые форумчане.

Вот назрел еще один возможно и глупый вопрос.
Есть ли в QT форматированное считывание из строки? Сейчас поясню что имею ввиду.
Клиент отправил запрос на сервер, и серверу надо разобрать вопрос. Скажем он выглядит таким образом
[ИМЯ_ОБЪЕКТА]{[ИМЯ_ДЕЙСТВИЯ][[ПАРАМЕТРЫ]] | СЛЕДУЮЩЕЕ ДЕЙСТВИЕ} ||| (следующие команды такого формата)
К примеру USER{LOGIN[name=a;pass=b]|NEWPASS[newpass=a;username=b]} |||...
Так вот - мне надо из строки считать всё что находится между { } вопрос: можно ли это сделать напрямую - указать что мы ждем запрос формата USER{LOGIN[%1]}  и считать этот %1?
Аналогично стандартному scanf из stdio.h.

Спасибо заранее.
Записан
crossly
Гость
« Ответ #1 : Сентябрь 30, 2010, 23:28 »

QRegExp??
Записан
olympian
Гость
« Ответ #2 : Октябрь 01, 2010, 11:38 »

А чтото проще регулярных выражений?
В старом добром С можно было писать чтото такого вида scanf("LOGIN{ADD[%s]}";
Всё видно и понятно -и никаких регулярных выражений не надо.
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #3 : Октябрь 01, 2010, 11:53 »

Неужели это намного сложнее:
Код:
QRegExp rx("LOGIN\\{ADD\\[(.+)\\]\\}");
if (rx.exactMatch(str))
    result = rx.cap(1);

Ну и никто не запрещает scanf использовать )
Записан

Гугль в помощь
whirlwind
Гость
« Ответ #4 : Октябрь 01, 2010, 14:05 »

Прошу прощения, вдруг вдохновение пришло, наваял программу, которая регекспами решает большую задачу топика http://pastebin.com/7PQQYg7A
Т.е. на входе было
Код:
    testStrings.append("obj1{act1[p1=v1;p2=v2]|act2[p1=v2]}|||"
                       "obj2{act3[p1=v1]|act2[p1=v1;p2=v2]}|||") ;

    testStrings.append( "obj2{act3[p1=v1]|act2[p1=v1;p2=v2]}|||" );

    testStrings.append( "obj1{act1[p1=v1]|act2[p1=v2]}|||"
                        "obj2{act3[p1=v1]|act2[p1=v1;p2=v2];p2=v2]}|||"
                        "obj3{act3[p1=v1]}|||" );

    testStrings.append( "obj1{act1[p1=v1]|act2[p1=v2]}|||"
                        "obj2{act3[p1=v1]|act2[p1=v1;p2=v2];p2=v2]}|||"
                        "obj3{act3[p1=v1]}|||" );
на выходе получилось

Код:
string to process: "obj1{act1[p1=v1;p2=v2]|act2[p1=v2]}|||obj2{act3[p1=v1]|act2[
p1=v1;p2=v2]}|||"
  command:  "obj1{act1[p1=v1;p2=v2]|act2[p1=v2]}|||"
    object name:  "obj1"
    all actions:  "act1[p1=v1;p2=v2]|act2[p1=v2]"
      action:  "act1[p1=v1;p2=v2]"
        action name: "act1"
        all parameters:  "p1=v1;p2=v2"
        a pair:  "p1=v1"
            parameter  "p1"  with value  "v1"
        a pair:  "p2=v2"
            parameter  "p2"  with value  "v2"
      action:  "act2[p1=v2]"
        action name: "act2"
        all parameters:  "p1=v2"
        a pair:  "p1=v2"
            parameter  "p1"  with value  "v2"
  command:  "obj2{act3[p1=v1]|act2[p1=v1;p2=v2]}|||"
    object name:  "obj2"
    all actions:  "act3[p1=v1]|act2[p1=v1;p2=v2]"
      action:  "act3[p1=v1]"
        action name: "act3"
        all parameters:  "p1=v1"
        a pair:  "p1=v1"
            parameter  "p1"  with value  "v1"
      action:  "act2[p1=v1;p2=v2]"
        action name: "act2"
        all parameters:  "p1=v1;p2=v2"
        a pair:  "p1=v1"
            parameter  "p1"  with value  "v1"
        a pair:  "p2=v2"
            parameter  "p2"  with value  "v2"

------------------------------------------------------

string to process: "obj2{act3[p1=v1]|act2[p1=v1;p2=v2]}|||"
  command:  "obj2{act3[p1=v1]|act2[p1=v1;p2=v2]}|||"
    object name:  "obj2"
    all actions:  "act3[p1=v1]|act2[p1=v1;p2=v2]"
      action:  "act3[p1=v1]"
        action name: "act3"
        all parameters:  "p1=v1"
        a pair:  "p1=v1"
            parameter  "p1"  with value  "v1"
      action:  "act2[p1=v1;p2=v2]"
        action name: "act2"
        all parameters:  "p1=v1;p2=v2"
        a pair:  "p1=v1"
            parameter  "p1"  with value  "v1"
        a pair:  "p2=v2"
            parameter  "p2"  with value  "v2"

------------------------------------------------------

string to process: "obj1{act1[p1=v1]|act2[p1=v2]}|||obj2{act3[p1=v1]|act2[p1=v1;
p2=v2];p2=v2]}|||obj3{act3[p1=v1]}|||"
  command:  "obj1{act1[p1=v1]|act2[p1=v2]}|||"
    object name:  "obj1"
    all actions:  "act1[p1=v1]|act2[p1=v2]"
      action:  "act1[p1=v1]"
        action name: "act1"
        all parameters:  "p1=v1"
        a pair:  "p1=v1"
            parameter  "p1"  with value  "v1"
      action:  "act2[p1=v2]"
        action name: "act2"
        all parameters:  "p1=v2"
        a pair:  "p1=v2"
            parameter  "p1"  with value  "v2"
  command:  "obj2{act3[p1=v1]|act2[p1=v1;p2=v2];p2=v2]}|||"
    object name:  "obj2"
    all actions:  "act3[p1=v1]|act2[p1=v1;p2=v2];p2=v2]"
      action:  "act3[p1=v1]"
        action name: "act3"
        all parameters:  "p1=v1"
        a pair:  "p1=v1"
            parameter  "p1"  with value  "v1"
      action:  "act2[p1=v1;p2=v2]"
        action name: "act2"
        all parameters:  "p1=v1;p2=v2"
        a pair:  "p1=v1"
            parameter  "p1"  with value  "v1"
        a pair:  "p2=v2"
            parameter  "p2"  with value  "v2"
  command:  "obj3{act3[p1=v1]}|||"
    object name:  "obj3"
    all actions:  "act3[p1=v1]"
      action:  "act3[p1=v1]"
        action name: "act3"
        all parameters:  "p1=v1"
        a pair:  "p1=v1"
            parameter  "p1"  with value  "v1"

------------------------------------------------------

string to process: "obj1{act1[p1=v1]|act2[p1=v2]}|||obj2{act3[p1=v1]|act2[p1=v1;
p2=v2];p2=v2]}|||obj3{act3[p1=v1]}|||"
  command:  "obj1{act1[p1=v1]|act2[p1=v2]}|||"
    object name:  "obj1"
    all actions:  "act1[p1=v1]|act2[p1=v2]"
      action:  "act1[p1=v1]"
        action name: "act1"
        all parameters:  "p1=v1"
        a pair:  "p1=v1"
            parameter  "p1"  with value  "v1"
      action:  "act2[p1=v2]"
        action name: "act2"
        all parameters:  "p1=v2"
        a pair:  "p1=v2"
            parameter  "p1"  with value  "v2"
  command:  "obj2{act3[p1=v1]|act2[p1=v1;p2=v2];p2=v2]}|||"
    object name:  "obj2"
    all actions:  "act3[p1=v1]|act2[p1=v1;p2=v2];p2=v2]"
      action:  "act3[p1=v1]"
        action name: "act3"
        all parameters:  "p1=v1"
        a pair:  "p1=v1"
            parameter  "p1"  with value  "v1"
      action:  "act2[p1=v1;p2=v2]"
        action name: "act2"
        all parameters:  "p1=v1;p2=v2"
        a pair:  "p1=v1"
            parameter  "p1"  with value  "v1"
        a pair:  "p2=v2"
            parameter  "p2"  with value  "v2"
  command:  "obj3{act3[p1=v1]}|||"
    object name:  "obj3"
    all actions:  "act3[p1=v1]"
      action:  "act3[p1=v1]"
        action name: "act3"
        all parameters:  "p1=v1"
        a pair:  "p1=v1"
            parameter  "p1"  with value  "v1"

------------------------------------------------------


Замечания:
1) на самом деле нужно было бы разнести код по отдельным процедурам. Кроме того, там по сути все время используется два одинаковых случая (разбивка строки на кусочки и разделение строки на "имя" и "строку со списком чего-то"). Соответственно, можно было бы сделать две универсальных процедуры
2) да, теоретически можно было бы для разбивания строк использовать split()
3) отдельно интересно было бы посмотреть на производительность
4) полный контроль синтаксиса. Если на вход будет подан текст с ошибкой, ее легко будет обнаружить.
5) весь разбор -- всего около ста строк  Показает язык
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #5 : Октябрь 01, 2010, 15:57 »

Есть еще boost::spirit, который для разбора таких штук тоже подходит не плохо, но нужно прокачаться до следующего уровня Веселый
Записан

Гугль в помощь
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 23.