Как сопоставить вложенные шаблоны с QRegularExpression? - PullRequest
2 голосов
/ 09 апреля 2019

Я пытаюсь получить с помощью QRegularExpression все однострочные комментарии, начинающиеся с '#'.Я использую globalMatch и итератор, но ему не удается найти «вложенные комментарии».

Я использую это регулярное выражение: # [^ \ n] *

И со следующим кодом:

const QString text { "Here # A test with some #comments" };
const QRegularExpression pattern { "#[^\n]*" };

QRegularExpressionMatchIterator it = pattern.globalMatch(text);
while (it.hasNext())
{
    const QRegularExpressionMatch match = it.next();
    qDebug() << match.capturedTexts()[0];
}

Он находит только глобальный комментарий, начинающийся с "# A test", а не второй.Есть ли способ сделать это?

Спасибо!

1 Ответ

3 голосов
/ 09 апреля 2019

Вы можете использовать

const QRegularExpression pattern { "(?=(#.*))" };
QRegularExpressionMatchIterator it = pattern.globalMatch(text);
while (it.hasNext())
{
    const QRegularExpressionMatch match = it.next();
    qDebug() << match.captured(1);
}

См. Демо regex

BTW, с QRegularExpressionMatch::captured, вы можете напрямую получить значениелюбой группы захвата, которая вам нужна.

Шаблон (?=(#.*)) - это позитивный прогноз, который проверяет каждую позицию внутри входной строки слева направо и фиксирует в Группе 1 a # с последующими 0+ символамикроме символов перевода строки как можно больше.

Обратите внимание, что в отличие от QRegExp, . в QRegularExpression не соответствует разрывам строк, поэтому [^\n] можно смело заменить на ..

...