Qt Syntax Highlighter Пример правила выделения однострочных комментариев

Взято из примера выделения синтаксиса Qt:

//single line comment rule
singleLineCommentFormat.setForeground(Qt::darkGray);
rule.pattern = QRegExp("//[^\n]*");
rule.format = singleLineCommentFormat;
highlightingRules.append(rule);
//string rule
quotationFormat.setForeground(Qt::darkGreen);
rule.pattern = QRegExp("\".*\"");
rule.pattern.setMinimal(true);
rule.format = quotationFormat;
highlightingRules.append(rule);

Проблема в том, что у вас есть что-то вроде этого:

"inside is darkGreen//"outside is darkGray

Как видите, результат такой: внутри кавычки будут серыми, включая двойной / . Но символы за пределами "" становятся темно-серыми, которые должны быть цветом шрифта по умолчанию (обычно черным). Как настроить RegExp для однострочного комментария, чтобы он знал, что зеленый «//» исключен из правила выделения darkGray?

Я попытался добавить это для правила комментирования одной строки:

rule.pattern.setMinimal(true);

Все равно не сработает. Я также пробовал:

rule.pattern = QRegExp("//[^\n]*\"*");

person Cold Cerberus    schedule 27.03.2015    source источник
comment
Я также пробовал rule.pattern = QRegExp(//([^\n]*)| (?!\));   -  person Cold Cerberus    schedule 27.03.2015


Ответы (1)


/(\"(?:(?!\/\/).)+?\")/

Используя волшебство групп без захвата и негативного взгляда вперед, я разработал следующее:

quotationFormat.setForeground(Qt::darkGreen);
rule.pattern = QRegExp("\"(?:(?!\\/\\/).)+\"");//QRegExp("\".*\"");

rule.pattern.setMinimal(true);
rule.format = quotationFormat;
highlightingRules.append(rule);

Применяется магия, и вы получаете поведение, которое ищете.

Использованная литература:

https://stackoverflow.com/a/977294/999943

http://regexr.com/3an21

а также протестировано в этом примере:

http://doc.qt.io/qt-5/qtwidgets-richtext-syntaxhighlighter-example.html

Надеюсь, это поможет.

person phyatt    schedule 27.03.2015
comment
Разве этого мало? : (\"[^/"]+\") - person murison; 27.03.2015
comment
Но тогда вы не можете поместить одну косую черту в двойные кавычки. Кроме того, я не думаю, что группы без захвата являются обязательным требованием, но я не изучал, используются ли группы захвата где-либо еще в коде. - person phyatt; 27.03.2015
comment
Это вывод: все черные до //остальные серые - person Cold Cerberus; 28.03.2015