Каким будет шаблон QRegExp для захвата цитируемого текста для QSyntaxHighlighter?
Тестовый образец
«один» или «два» или «три»
Пока что я попробовал:
QRegExp rx("\\0042.*\\0042");
QRegExp rx("(\\0042).*?\\1");
Последний шаблон успешно выполняется на regexpal.com, но не с классом QRegExp.
РЕДАКТИРОВАТЬ: Если вы проверить Пример подсветки синтаксиса, уже есть этот там.
http://qt-project.org/doc/qt-4.8/richtext-syntaxhighlighter-highlighter-cpp.html
quotationFormat.setForeground(Qt::darkGreen);
rule.pattern = QRegExp("\".*\"");
rule.format = quotationFormat;
highlightingRules.append(rule);
Просто скопируйте большую часть кода из примера подсветки Qt, и все будет готово.
В описании варианта Qt для RegEx говорится:
Примечание. Квантификаторы обычно являются «жадными». Они всегда соответствуют столько текста, сколько могут. Например, 0+ соответствует первому найденному нулю и всем последовательным нулям после первого нуля. Применяется к «20005», соответствует «20005». Квантификаторы могут быть сделаны не жадными, смотрите setMinimal ().
Если вы используете setMinimal(true)
чтобы получить эффект ленивого сопоставления вместо жадного сопоставления, вы можете выполнить его. Другие оценщики регулярных выражений используют что-то вроде *?
или же +?
выполнить ленивый матч. Иногда я использую двигатель регулярных выражений Гскиннера чтобы проверить мои выражения.
Ниже приведен код, который вы ищете. Это в значительной степени основано на приведенном примере Вот.
#include <QCoreApplication>
#include <QRegExp>
#include <QDebug>
#include <QStringList>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString str = "\"one\" or \"two\" or \"three\"";
QRegExp rx("\".*\"");
rx.setMinimal(true);
int count = 0;
int pos = 0;
while ((pos = rx.indexIn(str, pos)) != -1) {
++count;
pos += rx.matchedLength();
qDebug() << rx.cap();
}
return a.exec();
}
Надеюсь, это поможет.
Других решений пока нет …