Нужна помощь с регулярными выражениями в Qt (QRegExp) [неверный синтаксис повторения?] - PullRequest
2 голосов
/ 22 декабря 2010
void MainWindow::whatever(){
    QRegExp rx ("<span(.*?)>");
    //QString line = ui->txtNet1->toHtml();
    QString line = "<span>Bar</span><span style='baz'>foo</span>";
    while(line.contains(rx)){
        qDebug()<<"Found rx!";
        line.remove (rx);
    }
}

Я протестировал регулярное выражение в Интернете, используя этот инструмент . С заданной строкой регулярного выражения и примером текста <span style="foo">Bar</span> инструмент сообщает, что в строке должно быть найдено регулярное выражение. Однако в моем коде Qt я никогда не попадаю в цикл while.

Я действительно никогда раньше не использовал регулярные выражения в Qt или любом другом языке. Может ли кто-нибудь помочь? Спасибо!

[править] Поэтому я обнаружил, что QRegExp имеет функцию errorString(), которую можно использовать, если регулярное выражение недопустимо. Я вывожу это и вижу: «неправильный синтаксис повторения». Не совсем уверен, что это значит. Конечно, поиск «плохого синтаксиса повторений» поднимает ... этот пост. Блин гугл, ты быстро.

Ответы [ 2 ]

11 голосов
/ 22 декабря 2010

Проблема в том, что QRegExp поддерживает только жадные квантификаторы.Точнее, поддерживает либо жадные , либо квантификаторы, но не оба .Таким образом, <span(.*?)> недопустимо, поскольку нет оператора *?.Вместо этого вы можете использовать

QRegExp rx("<span(.*)>");
rx.setMinimal(true);

Это даст каждые *, + и ? в QRegExp поведении *?, +? и ?? соответственно, а не их поведение по умолчанию.Разница, как вы можете знать или не знать, состоит в том, что минимальные версии соответствуют небольшим символам, а не многим .

В этом случае, вы также можете написать

QRegExp rx("<span([^>]*)>");

Это, вероятно, то, что я бы сделал, так как он имеет тот же эффект: сопоставляйте, пока не увидите >.Да, у вас более общий характер (если у вас есть многосимвольный окончательный токен), но я думаю, что в простом случае это немного лучше.Разумеется, любой из них будет работать.

Кроме того, будет очень и очень осторожен при разборе HTML с регулярными выражениями .На самом деле вы не можете этого сделать, и распознать теги - хотя (я считаю) это возможно - намного сложнее, чем просто это.(Комментарии, блоки CDATA и инструкции по обработке не дают покоя.) Если вы знаете, какие данные вы просматриваете, это может быть приемлемым решением;Тем не менее, вместо этого я бы заглянул в анализатор HTML.

1 голос
/ 22 декабря 2010

Чего ты пытаешься достичь?Если вы хотите удалить открывающий тег и его элементы, то шаблон

<span[^>]*>

, вероятно, самый простой.

Синтаксис. *?означает не жадное совпадение, которое широко поддерживается, но может ввести в заблуждение механизм регулярных выражений QT.

...