Здравствуйте уважаемые форумчане.
Вот назрел еще один возможно и глупый вопрос.
Есть ли в QT форматированное считывание из строки? Сейчас поясню что имею ввиду.
Клиент отправил запрос на сервер, и серверу надо разобрать вопрос. Скажем он выглядит таким образом
[ИМЯ_ОБЪЕКТА]{[ИМЯ_ДЕЙСТВИЯ][[ПАРАМЕТРЫ]] | СЛЕДУЮЩЕЕ ДЕЙСТВИЕ} ||| (следующие команды такого формата)
К примеру USER{LOGIN[name=a;pass=b]|NEWPASS[newpass=a;username=b]} |||...
Так вот - мне надо из строки считать всё что находится между { } вопрос: можно ли это сделать напрямую - указать что мы ждем запрос формата USER{LOGIN[%1]} и считать этот %1?
Аналогично стандартному scanf из stdio.h.
Спасибо заранее.
Неужели это намного сложнее:
QRegExp rx("LOGIN\\{ADD\\[(.+)\\]\\}");
if (rx.exactMatch(str))
result = rx.cap(1);
Ну и никто не запрещает scanf использовать )
Прошу прощения, вдруг вдохновение пришло, наваял программу, которая регекспами решает большую задачу топика 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
Есть еще boost::spirit, который для разбора таких штук тоже подходит не плохо, но нужно прокачаться до следующего уровня :D