Russian Qt Forum

Qt => Общие вопросы => Тема начата: Bepec от Январь 21, 2013, 11:39



Название: RegExp или работа со строкой.
Отправлено: Bepec от Январь 21, 2013, 11:39
Прошу совета - имеется ли готовое решение на базе RegExp или ином виде, для того чтобы:

из строки вида
Цитировать
index: (utf8string (v i=1105))
name: (string (v s=Тряляля))
Получить на выходе массив
Цитировать
[1] 1105
[2] Тряляля

Собственно вариаций может быть много, но есть чёткая структура. Хотелось бы возможности вбить шаблон аля "index: (utf8string (v i=%1))" и в результате на выхлопе получить массив из содержимого между "index: (utf8string (v i=" и ")".





Название: Re: RegExp или работа со строкой.
Отправлено: Пантер от Январь 21, 2013, 11:53
Код:
\w*: \(\w* \(\w* \w*=(.*)\)\)


Название: Re: RegExp или работа со строкой.
Отправлено: Bepec от Январь 21, 2013, 12:14
Чего то нулевой эффект :) Не могли бы вы привести малость пояснений, куда его запихивать. В RegExp cap()?

К тому же вариантов написания и типов множество. Я привёл лишь пару для примера :)


Название: Re: RegExp или работа со строкой.
Отправлено: Пантер от Январь 21, 2013, 12:18
Код
C++ (Qt)
const QRegExp re ("\\w*: \\(\\w* \\(\\w* \\w*=(.*)\\)\\)");
if (re.exactMatch (string)) {
 qDebug () << re.cap (1);
}
 


Название: Re: RegExp или работа со строкой.
Отправлено: Bepec от Январь 21, 2013, 12:22
Нулевой результат на строках

Код:
nodeId=(OPC::NodeId (v i=10001))
nodeId=(OPC::NodeId (v i=11001))
address=(utf8string (v 1))
nodeId=(OPC::NodeId (v i=11003))

Пролетает условие.
 


Название: Re: RegExp или работа со строкой.
Отправлено: Пантер от Январь 21, 2013, 12:25
Что-то у тебя слишком много вариантов получается. Конкретизируй задачу.


Название: Re: RegExp или работа со строкой.
Отправлено: Bepec от Январь 21, 2013, 12:30
Собственно я и прошу подсказать - имеется ли лексический анализатор готовый :) Чтобы работать с множеством вариантов на основе шаблонов, в которых указана статичная часть и место значения.

Т.е. одним RegExp не справиться - я это понимаю. И это логично. ( это лишь малая часть вариантов :) )

Собственно интересуюсь аналогом %1 в QString'е только наоборот :D

PS видимо самому придётся писать ^^



Название: Re: RegExp или работа со строкой.
Отправлено: Пантер от Январь 21, 2013, 12:33
Можно попробовать вот так: на вход юзер вводит
index: (utf8string (v i=%1))
ты это переводишь в
index: \\(utf8string \\(v i=(*.)\\)\\)
и натравливаешь QRegExp.
Главное, почитать доку по регекспам и отэкранировать нужные символы при конверте.


Название: Re: RegExp или работа со строкой.
Отправлено: Bepec от Январь 21, 2013, 12:46
Спасибо за направление моей деятельности хоть в какую то сторону :)

Посмотрю что можно сделать.

update: Нет, предложенный способ не покатит к сожалению. Что ж - "привет привет, мой кривой лексический анализатор" :)


Название: Re: RegExp или работа со строкой.
Отправлено: Igors от Январь 21, 2013, 12:59
Код
C++ (Qt)
const char * input = "name : ( string ( v s = Тряляля ) )";
char buf1[128], buf2[128], buf3[128], buf4[128]. buf5[128];
sscanf(input, "%s : ( %s ( %s %s = %s ) )", buf1, buf2, buf3, buf4, buf5);
 
Edit: к сожалению, придется вставить пробелы  :)


Название: Re: RegExp или работа со строкой.
Отправлено: Bepec от Январь 21, 2013, 13:04
Igors - бачит только в первый массив "name:". Остальные запружены шумом :)

PS искреннее спасибо всем за желание помочь. Ещё будут предложения - пишите :)


Название: Re: RegExp или работа со строкой.
Отправлено: Igors от Январь 21, 2013, 13:10
Igors - бачит только в первый массив "name:". Остальные запружены шумом :)
Попробуйте с пробелами (см Edit)


Название: Re: RegExp или работа со строкой.
Отправлено: Bepec от Январь 21, 2013, 13:17
Не котируется :) Менять формат противопоказано. Ибо их десятки.

Хотя оригинальное решение - практичный split :)

PS это ещё простейшая конструкция :D Есть и с табами/двоеточиями/массивами :)


Название: Re: RegExp или работа со строкой.
Отправлено: Old от Январь 21, 2013, 13:29
PS это ещё простейшая конструкция :D Есть и с табами/двоеточиями/массивами :)
Так может стоит сразу взять boost spirit или lex?


Название: Re: RegExp или работа со строкой.
Отправлено: Bepec от Январь 21, 2013, 13:31
Кхм... Я как бы и спрашиваю, имеются ли решения, или стоит свой велописед писать.


Название: Re: RegExp или работа со строкой.
Отправлено: Igors от Январь 21, 2013, 14:05
Ну хорошо
Собственно вариаций может быть много, но есть чёткая структура. Хотелось бы возможности вбить шаблон аля "index: (utf8string (v i=%1))" и в результате на выхлопе получить массив из содержимого между "index: (utf8string (v i=" и ")".
Если я верно понял, парсер не требуется, нужно только определить сбивается строка по форматке или нет. Тогда вроде и смысла нет запрягать какой-то тул. Задаем форматку  "index: (utf8string (v i=%1))"

1) По форматке ищем %, имеем подстроку от начала до %
2) Сравниваем подстроку с текущей (ну возможно без учета пробелов и табов). В результате имеем позицию что соответствует % в текущей строке
3) Извлекаем значение из текущей строки
4) Возможно проверяем хвостики на совпадение


Название: Re: RegExp или работа со строкой.
Отправлено: Bepec от Январь 21, 2013, 14:06
Ну собственно данный экземпляр велосипеда недавно начал свою работу третьим колесом :D


Название: Re: RegExp или работа со строкой.
Отправлено: Igors от Январь 21, 2013, 14:13
Ну собственно данный экземпляр велосипеда недавно начал свою работу третьим колесом :D
И что здесь плохого? Почему надо обязательно "чем-то воспользоваться"?  :)


Название: Re: RegExp или работа со строкой.
Отправлено: Bepec от Январь 21, 2013, 14:16
Я просто обоснованно думаю, что мой код, использующий всякие indexOf,  по сравнению с другими решениями, очень медлителен и затратен :)


Название: Re: RegExp или работа со строкой.
Отправлено: Old от Январь 21, 2013, 14:29
Я просто обоснованно думаю, что мой код, использующий всякие indexOf,  по сравнению с другими решениями, очень медлителен и затратен :)
Точно. Проще один раз описать все правила и забыть про его разбор, чем после каждого чиха, что-то дописывать, отлаживать и проверять.


Название: Re: RegExp или работа со строкой.
Отправлено: panAlexey от Январь 21, 2013, 15:57
Прошу совета - имеется ли готовое решение на базе RegExp или ином виде, для того чтобы:

из строки вида
Цитировать
index: (utf8string (v i=1105))
name: (string (v s=Тряляля))
Получить на выходе массив
Цитировать
[1] 1105
[2] Тряляля

Собственно вариаций может быть много, но есть чёткая структура. Хотелось бы возможности вбить шаблон аля "index: (utf8string (v i=%1))" и в результате на выхлопе получить массив из содержимого между "index: (utf8string (v i=" и ")".
Интересно, кто автор этого велосипеда? :)


Название: Re: RegExp или работа со строкой.
Отправлено: GreatSnake от Январь 21, 2013, 16:56
.*[=:].*\(.*\(.*=(.*)\)\)


Название: Re: RegExp или работа со строкой.
Отправлено: kambala от Январь 21, 2013, 17:07
а если втупую =(.+)\)\) ? нас же не интересует начало.


Название: Re: RegExp или работа со строкой.
Отправлено: Bepec от Январь 22, 2013, 07:35
Создатель сиего творения почивает лавры в далёёёких далях :)



Название: Re: RegExp или работа со строкой.
Отправлено: Igors от Январь 22, 2013, 10:01
Создатель сиего творения почивает лавры в далёёёких далях :)
Наверное "на лаврах" :) Все равно - не пойму какие основания для фыркания и "поджимания губок", дескать, ах, какой велосипед - ну почему же он не воспользовался чем-то известным, напр xml или json. Ну может не у всех под рукой мощный инструментарий, или не все хотят им обязательно пользоваться. 

а если втупую =(.+)\)\) ? нас же не интересует начало.
По смыслу - должно интересовать, напр мы не должны добавлять в массив int если тип string


Название: Re: RegExp или работа со строкой.
Отправлено: Bepec от Январь 22, 2013, 10:32
to igors: Угум. Первая часть тоже будет интересовать. Но в дальнейшей перспективе.

На данный момент нужен был огрызок функционала. Структура данных в самом классе выстраивается за счёт точного знания структуры данных.

РегЭсп не осилил многообразия, использую свой велосипед.

Почему такой непонятный формат и почему не написать самому?

Потому что нужно : "когда было нужно? в прошлом году".
Написать самому потому что : "в результате придётся написать свой парсер".

PS а формат является, насколько я помню, алгоритмом сериализации "parens".

Попозж


Название: Re: RegExp или работа со строкой.
Отправлено: panAlexey от Январь 22, 2013, 10:40
Немного похоже на IBM-овские файлы конфигурации.