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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: regexp  (Прочитано 5591 раз)
crossly
Гость
« : Январь 27, 2009, 17:07 »

товарищи!!.... нужна светлая голова.... т.е. помощь в составлении регулярного выражения...
есть текст
Цитировать
А1. ываполрдлоыарп: 1) фвыаюлож; 2) фвплорыва; Примечание: ыпдлорап .
нужно запихнуть это в QStringList
должно получится:
1. ываполрдлоыарп
2. фвыаюлож
3. фвплорыва
4. ыпдлорап
помогите плиз...
Записан
ритт
Гость
« Ответ #1 : Январь 27, 2009, 17:18 »

в исходно строке сначала "А1." и терминатор ":", затем уже начало "1)" и терминатор ";", а в последнем случае начало вообще без циферки и включает один из предыдущих терминаторов, а терминатор "."

по какому принципу должен быть разбор и нумерация в списке?
Записан
crossly
Гость
« Ответ #2 : Январь 27, 2009, 17:46 »

вот что у меня получилось с онлайн построителем http://www.regexpres.narod.ru/calculator.html
Код:
[А,В]\d.|\d\)|Примечание:
там я поставил галку "split".... как теперь это с Qt подружить...??
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


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

2 crossly, используй QString::split(QRegExp)
Записан

Юра.
gmorgunov
Гость
« Ответ #4 : Январь 28, 2009, 15:54 »

Можно так ,например, подружить.На выходе то, что вам нужно:
Код:
#include <QtGui>
int main(int argc, char** argv)
{
    QApplication  app(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF8"));

    QString str = QObject::tr("А1. ываполрдлоыарп: 1) фвыаюлож; 2) фвплорыва;Примечание: ыпдлорап .");
    qDebug() << str ;

    QRegExp rx("(\\w+)");

    // разбиваем на слова
    QStringList list;
    int pos = 0;
    while ((pos = rx.indexIn(str, pos)) != -1) {
        list << rx.cap(1);
        pos += rx.matchedLength();
    }
    qDebug() << list;

    // формируем QStringList lresult
    QStringList lresult;
    QString s;
    for (int i = 0; i<4; i++) {
        s.setNum(i+1);
        lresult.append(s + ". " + list[i*2+1]);
        qDebug() << lresult[i];
    }
    return 0;
}
Записан
crossly
Гость
« Ответ #5 : Январь 29, 2009, 15:38 »

короче суть вопроса усложняется... Улыбающийся.... мне нужно разобрать форматированный текст (html)...
что пришло мне в голову... гружу хтмл в QTextDocument (дабы не разбирать тэги)...
далее с помощью
Код:
QTextCursor QTextDocument::find ( const QRegExp & expr, int position = 0, FindFlags options = 0 ) const
выделяю нужные мне куски и сохраняю QStringList...
в общем алгоритм получился такой..
Код:
        QFile f(QDir::homePath()+QDir::separator()+"bel.html");
if(!f.open(QIODevice::ReadOnly))
qDebug()<<"error";
QString str=QString(f.readAll());
QTextDocument *doc=new QTextDocument(str);
QTextCursor tc=doc->find(QRegExp("[А|B]\\d.*\\d\\)"),0);
int i=tc.position();
QStringList list;
list<<tc.selection().toHtml();
while(i>0)
{
QTextCursor tc=doc->find(QRegExp("[А|В]\\d.*\\d\\)"),i);
i=tc.position();
list<<tc.selection().toHtml();
}
но видно я не до понимаю regexp.... в данном случае я получаю
Код:
А1. ываполрдлоыарп: 1) фвыаюлож; 2)
вместо
Код:
А1. ываполрдлоыарп: 1)
помогите плиз разобратся....
Записан
Rcus
Гость
« Ответ #6 : Январь 29, 2009, 15:41 »

Цитировать
QRegExp's quantifiers are the same as Perl's greedy quantifiers (but see the note above). Non-greedy matching cannot be applied to individual quantifiers, but can be applied to all the quantifiers in the pattern. For example, to match the Perl regexp ro+?m requires:

 QRegExp rx("ro+m");
 rx.setMinimal(true);
Записан
crossly
Гость
« Ответ #7 : Январь 29, 2009, 15:52 »

большое спасибо
Записан
crossly
Гость
« Ответ #8 : Февраль 04, 2009, 18:30 »

привет всем .... нужна ещё помощь в поиске в QTextDocument...
содержание документа..
Код:
А1. ываполрдлоыарп: 
 1) фвыаюлож;
 2) фвплорыва;
Примечание: ыпдлорап .
при find(QRegExp("A\\d.*\\d\\)"),0) ничего не находит (хотя по идее должно быть А1. ываполрдлоыарп:
 1) фвыаюлож;
 2))
при  find(QRegExp("A\\d.*)"),0) находит первую строку ... из чего могу сделать вывод что поиск идёт не по всему документу, а только по первой строке...
Помогите плиз добится нужного результата...
« Последнее редактирование: Февраль 04, 2009, 18:32 от crossly » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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