Нужна помощь с регулярными выражениями в QT (QREGEXP) [Синтаксис плохого повторения?
Вопрос
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.