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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QRegExp  (Прочитано 5700 раз)
sendevent
Гость
« : Ноябрь 29, 2008, 14:30 »

есть строка вида
Код:
<start>reached data0<separator>reached data1 ... <separator>reached dataN<end>
можно ли вытащить данные одним регвыром?
интересует чтото вроде "<start>(.*(?!<separator>))<end>" (это просто пример, што он делает понимаю, не понимаю как сказать "выбрать все кроме ...")
то ли с синтаксисом никак не разберусь, то ли регекспами так не делается... Непонимающий
« Последнее редактирование: Ноябрь 29, 2008, 16:44 от sendevent » Записан
Rcus
Гость
« Ответ #1 : Ноябрь 29, 2008, 14:36 »

думаю будет проще это сделать при помощи QStringList QString::split
Записан
sendevent
Гость
« Ответ #2 : Ноябрь 29, 2008, 14:41 »

да, можно и сплитом, можно и в "больше чем один" этапов...
нужно - в одно выражение.
тем более, казалось бы - простейшая задача, ан нет же, и тут застопорилось.
Записан
Rcus
Гость
« Ответ #3 : Ноябрь 29, 2008, 17:45 »

Забыл спросить, вам нужно решить задачу или это разминка на тему регекспов?
Эту задачу можно решить множеством способов, например вот два (1й делает предположение относительно содержимого строки, а второй медленнее в два раза Улыбающийся)
Код
C++ (Qt)
QStringList strSplit(const QString& str)
{
   static const QString separator = QString("<separator>");
   static const QString start = QString("<start>");
   static const QString end = QString("<end>");
   return str.mid(start.length(),str.length() - start.length() - end.length()).split(separator);
}
Код
C++ (Qt)
QStringList strSplit(const QString& str)
{
   static QRegExp _r = QRegExp("<start>(.*)<end>");
   return _r.exactMatch(str) ? _r.cap(1).split("<separator>") : QStringList();
}
« Последнее редактирование: Ноябрь 29, 2008, 19:41 от Rcus » Записан
sendevent
Гость
« Ответ #4 : Ноябрь 30, 2008, 11:11 »

это кусок фронтенда тулзы для себя - цели-то определены, а вот способы реализации - эксперементирую.... объемы данных небольшие - быстродействие не критично. в общем, с одной стороны - да, надо решить задачу, с другой - размялся с регвырами:)
в принципе, можно использовать выражение
Код:
(?:<start>|<separator>)(.*)(?:<separator>|<end>)
но данные могут быть в html/xml, а наигравшись с синтаксисиом, повнимательнее перечитал ассистент:
Цитировать
Note that in general regexps cannot be used to check for balanced brackets or tags. For example if you want to match an opening html <b> and its closing <b>, you can only use a regexp if you know that these tags are not nested; the html fragment, <b>bold <b>bolder</b></b> will not match as expected. If you know the maximum level of nesting it is possible to create a regexp that will match correctly, but for an unknown level of nesting, regexps will fail.
решение - использую связку из регекспов (т.е. одним не обошлось), при этом <start>-<separator>-<end> - тоже регулярные выражения... если повозиться с их формированием - проблем с "balanced brackets or tags"-документами не возникает (по крайней мере, мне не попались:) )
Rcus, спасибо вам большое за ответы, вопрос можно считать закрытым.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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