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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: RegExp или работа со строкой.  (Прочитано 11349 раз)
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=" и ")".



Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Январь 21, 2013, 11:53 »

Код:
\w*: \(\w* \(\w* \w*=(.*)\)\)
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Bepec
Гость
« Ответ #2 : Январь 21, 2013, 12:14 »

Чего то нулевой эффект Улыбающийся Не могли бы вы привести малость пояснений, куда его запихивать. В RegExp cap()?

К тому же вариантов написания и типов множество. Я привёл лишь пару для примера Улыбающийся
« Последнее редактирование: Январь 21, 2013, 12:17 от Bepec » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Январь 21, 2013, 12:18 »

Код
C++ (Qt)
const QRegExp re ("\\w*: \\(\\w* \\(\\w* \\w*=(.*)\\)\\)");
if (re.exactMatch (string)) {
 qDebug () << re.cap (1);
}
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Bepec
Гость
« Ответ #4 : Январь 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))

Пролетает условие.
 
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Январь 21, 2013, 12:25 »

Что-то у тебя слишком много вариантов получается. Конкретизируй задачу.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Bepec
Гость
« Ответ #6 : Январь 21, 2013, 12:30 »

Собственно я и прошу подсказать - имеется ли лексический анализатор готовый Улыбающийся Чтобы работать с множеством вариантов на основе шаблонов, в которых указана статичная часть и место значения.

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

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

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

Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Январь 21, 2013, 12:33 »

Можно попробовать вот так: на вход юзер вводит
index: (utf8string (v i=%1))
ты это переводишь в
index: \\(utf8string \\(v i=(*.)\\)\\)
и натравливаешь QRegExp.
Главное, почитать доку по регекспам и отэкранировать нужные символы при конверте.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Bepec
Гость
« Ответ #8 : Январь 21, 2013, 12:46 »

Спасибо за направление моей деятельности хоть в какую то сторону Улыбающийся

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

update: Нет, предложенный способ не покатит к сожалению. Что ж - "привет привет, мой кривой лексический анализатор" Улыбающийся
« Последнее редактирование: Январь 21, 2013, 13:01 от Bepec » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Январь 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: к сожалению, придется вставить пробелы  Улыбающийся
« Последнее редактирование: Январь 21, 2013, 13:06 от Igors » Записан
Bepec
Гость
« Ответ #10 : Январь 21, 2013, 13:04 »

Igors - бачит только в первый массив "name:". Остальные запружены шумом Улыбающийся

PS искреннее спасибо всем за желание помочь. Ещё будут предложения - пишите Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Январь 21, 2013, 13:10 »

Igors - бачит только в первый массив "name:". Остальные запружены шумом Улыбающийся
Попробуйте с пробелами (см Edit)
Записан
Bepec
Гость
« Ответ #12 : Январь 21, 2013, 13:17 »

Не котируется Улыбающийся Менять формат противопоказано. Ибо их десятки.

Хотя оригинальное решение - практичный split Улыбающийся

PS это ещё простейшая конструкция Веселый Есть и с табами/двоеточиями/массивами Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Январь 21, 2013, 13:29 »

PS это ещё простейшая конструкция Веселый Есть и с табами/двоеточиями/массивами Улыбающийся
Так может стоит сразу взять boost spirit или lex?
Записан
Bepec
Гость
« Ответ #14 : Январь 21, 2013, 13:31 »

Кхм... Я как бы и спрашиваю, имеются ли решения, или стоит свой велописед писать.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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