我正在使用正则表达式
"\x1B[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]"
从字符串中去除 ANSI 控制代码。这适用于 sed,但如果我将该字符串提供给 QRegularExpression,它将无法匹配控制字符。我试过使用 QRegularExpression::escape() 函数;尝试只转义前导 '\x1B'; 尝试使用 '\e' 代替它,但都无济于事。
我正在使用正则表达式
"\x1B[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]"
从字符串中去除 ANSI 控制代码。这适用于 sed,但如果我将该字符串提供给 QRegularExpression,它将无法匹配控制字符。我试过使用 QRegularExpression::escape() 函数;尝试只转义前导 '\x1B'; 尝试使用 '\e' 代替它,但都无济于事。
尝试这个
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"
in QRegularExpression
(在第一种情况下,它只是0x1b
符号)。
您可以使用原始字符串文字并忘记转义正则表达式转义的问题:
auto re = QRegularExpression { R"\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mK]" };
在这里,每个\
都被视为文字反斜杠。
另请注意,[m|K]
匹配3 个字符m
:K
和 |
. 在正字符类中,字符是OR -ed,并被|
解析为文字符号。