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
а также |
, Внутри класса положительных символов символы имеют ИЛИ и |
анализируется как буквальный символ.