Russian Qt Forum

Qt => Общие вопросы => Тема начата: sendevent от Ноябрь 29, 2008, 14:30



Название: QRegExp
Отправлено: sendevent от Ноябрь 29, 2008, 14:30
есть строка вида
Код:
<start>reached data0<separator>reached data1 ... <separator>reached dataN<end>
можно ли вытащить данные одним регвыром?
интересует чтото вроде "<start>(.*(?!<separator>))<end>" (это просто пример, што он делает понимаю, не понимаю как сказать "выбрать все кроме ...")
то ли с синтаксисом никак не разберусь, то ли регекспами так не делается... ???


Название: Re: QRegExp
Отправлено: Rcus от Ноябрь 29, 2008, 14:36
думаю будет проще это сделать при помощи QStringList QString::split


Название: Re: QRegExp
Отправлено: sendevent от Ноябрь 29, 2008, 14:41
да, можно и сплитом, можно и в "больше чем один" этапов...
нужно - в одно выражение.
тем более, казалось бы - простейшая задача, ан нет же, и тут застопорилось.


Название: Re: QRegExp
Отправлено: Rcus от Ноябрь 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();
}


Название: Re: QRegExp
Отправлено: sendevent от Ноябрь 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, спасибо вам большое за ответы, вопрос можно считать закрытым.