Russian Qt Forum

Qt => Общие вопросы => Тема начата: olympian от Сентябрь 30, 2010, 23:23



Название: Считывание из QString
Отправлено: olympian от Сентябрь 30, 2010, 23:23
Здравствуйте уважаемые форумчане.

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

Спасибо заранее.


Название: Re: Считывание из QString
Отправлено: crossly от Сентябрь 30, 2010, 23:28
QRegExp??


Название: Re: Считывание из QString
Отправлено: olympian от Октябрь 01, 2010, 11:38
А чтото проще регулярных выражений?
В старом добром С можно было писать чтото такого вида scanf("LOGIN{ADD[%s]}";
Всё видно и понятно -и никаких регулярных выражений не надо.


Название: Re: Считывание из QString
Отправлено: navrocky от Октябрь 01, 2010, 11:53
Неужели это намного сложнее:
Код:
QRegExp rx("LOGIN\\{ADD\\[(.+)\\]\\}");
if (rx.exactMatch(str))
    result = rx.cap(1);

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


Название: Re: Считывание из QString
Отправлено: whirlwind от Октябрь 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) весь разбор -- всего около ста строк  :P


Название: Re: Считывание из QString
Отправлено: navrocky от Октябрь 01, 2010, 15:57
Есть еще boost::spirit, который для разбора таких штук тоже подходит не плохо, но нужно прокачаться до следующего уровня :D