0

我正在使用正则表达式

"\x1B[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]"

从字符串中去除 ANSI 控制代码。这适用于 sed,但如果我将该字符串提供给 QRegularExpression,它将无法匹配控制字符。我试过使用 QRegularExpression::escape() 函数;尝试只转义前导 '\x1B'; 尝试使用 '\e' 代替它,但都无济于事。

4

2 回答 2

1

尝试这个

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符号)。

于 2017-05-02T23:04:55.307 回答
0

您可以使用原始字符串文字并忘记转义正则表达式转义的问题:

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

在这里,每个\都被视为文字反斜杠。

另请注意[m|K]匹配3 个字符mK |. 在正字符类中,字符是OR -ed,并被|解析为文字符号。

于 2017-05-03T09:19:39.520 回答