LINUX.ORG.RU

Qstringlist/Qstring. Субстроки, заключенные в регулярные выражения.

 , ,


0

1

Нужно извлечь субстроки из строки, заключенные в какие либо символы. Наверно, тупо объяснил... Например:

QStringList sl;
QString str = "some words <<right word>> other words <<even right word>> smth";

sl = str.что-то("<<", ">>"); //Типа split()
//sl: ["right word", "even right word"]

Как-то так. Надеюсь, суть ясна. Заранее благодарю.



Последнее исправление: Yaourt (всего исправлений: 1)
Ответ на: комментарий от devsdc

Как конкретно к этому случаю подступиться не понял. В описании класса есть няшные примеры, они все крутятся где-то около этого, но ясности не вносят.

Yaourt
() автор топика
Ответ на: комментарий от Yaourt

Ну вот я взял первый попавшийся пример, для заранее неизвестного числа матчащихся подстрок:

 QRegExp rx("(\\d+)");
 QString str = "Offsets: 12 14 99 231 7";
 QStringList list;
 int pos = 0;

 while ((pos = rx.indexIn(str, pos)) != -1) {
     list << rx.cap(1);
     pos += rx.matchedLength();
 }
 // list: ["12", "14", "99", "231", "7"]

Возьми да вставь в конструктор QRegExp нужную регулярку, в чём проблема?

devsdc ★★
()
Ответ на: комментарий от Yaourt

А, ну и да, если тебе нужно матчить строки как-то с учётом вложенности (например, все выражения в скобках в "(ab(ac(ab)a)))"), то регулярками ты тут не справишься. Правильные скобочные последовательности не являются регулярным языком. Это так, на всякий случай.

devsdc ★★
()
Ответ на: комментарий от devsdc

дык, почти оно.

#include <QCoreApplication>

#include <QString>
#include <QStringList>
#include <QRegExp>

#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    const QString str = "for there is nothing either <<good>> or"
                        "<<bad>>, but thinking <<makes it so>>";
    QRegExp rx("<<(.*)>>");
    rx.setMinimal(true);
    QStringList list;

    int pos = rx.indexIn(str, 0);
    while (pos > -1) {
        list.append(rx.cap(1));
        pos = rx.indexIn(str, pos + 1);
    }

    qDebug() << "list: " << list;

    return a.exec();
}
Stil ★★★★★
()
Ответ на: комментарий от devsdc

Я пробовал эту конструкцию. В моем случае QRegExp rx(«<<*>>»), так понимаю, но это меня не привело к успеху. Или rx как-то экранировать надо?

Yaourt
() автор топика
Ответ на: комментарий от Stil

Отлично. То, что надо. Спасибо. Я аргумент для QRegExp не правильно оформлял.

Yaourt
() автор топика
Ответ на: комментарий от Stil

О, кстати, а разве конструкция ".*" не является «жадной»?

devsdc ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.