QRegularExpression для удаления кодов управления ANSI

Я использую регулярное выражение

"\ X1B[([0-9]{1,2}(;? [0-9]{1,2}))?[М | К]"

вырезать управляющие коды ANSI из строки. Это прекрасно работает с sed, но если я передаю эту строку в выражение QRegularExpression, оно не соответствует контрольным символам. Я пытался использовать функцию QRegularExpression::escape(); попытался убежать только от ведущего '\x1B'; попытался использовать '\e' на своем месте, но все безрезультатно.

2 ответа

Попробуй это

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    const char data[] = "some \x1b[31;1mtext";

    QRegularExpression re("\\x1B\\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]");
    QRegularExpressionMatch match = re.match(data);

    if (!re.isValid()) {
        std::cout << "not valid" << std::endl;
    }
    if (match.hasMatch()) {
        std::cout << "matched" << std::endl;
    }

    return 0;
}

Вы должны избегать символов, таких как [ ("\\["). Вы можете использовать оба "\x1b" а также "\\x1b" в QRegularExpression (в первом случае это будет просто 0x1b условное обозначение).

Вы можете использовать необработанный строковый литерал и забыть о проблемах с экранированием регулярных выражений:

auto re = QRegularExpression { R"\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mK]" };

Здесь каждый \ трактуется как буквальная обратная косая черта.

Также обратите внимание, что [m|K] соответствует 3 символам: m, K а также |, Внутри класса положительных символов символы имеют ИЛИ и | анализируется как буквальный символ.

Другие вопросы по тегам