Нужна помощь с регулярными выражениями в QT (QREGEXP) [Синтаксис плохого повторения?

StackOverflow https://stackoverflow.com/questions/4507224

  •  12-10-2019
  •  | 
  •  

Вопрос

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 -коде я никогда не попадаю в свою петлю.

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

РЕДАКТИРОВАТЬ] Поэтому я только что обнаружил, что QRegexp имеет функцию errorString() Использовать, если корпорация недействительна. Я вывожу это и вижу: «Синтаксис плохого повторения». Не совсем уверен, что это значит. Конечно, Googling для "плохого синтаксиса повторения" поднимает ... этот пост. Черт возьми, вы быстро.

Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

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

<span[^>]*>

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top