Название: 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 Код
Название: Re: RegExp или работа со строкой. Отправлено: Bepec от Январь 21, 2013, 12:22 Нулевой результат на строках
Код: nodeId=(OPC::NodeId (v i=10001)) Пролетает условие. Название: 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 Код 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-овские файлы конфигурации.
|