QRegularExpression剥离ANSI控制代码

时间:2017-05-02 16:47:00

标签: regex qt qregexp qregularexpression

我正在使用正则表达式

  

“\ X1B [([0-9] {1,2}(; [0-9] {1,2}))?[M | K]”

从字符串中剥离ANSI控制代码。这对sed工作得很好,但如果我将该字符串提供给QRegularExpression,则无法匹配控制字符。我尝试过使用QRegularExpression :: escape()函数;试图逃避领先的'\ x1B';尝试在其位置使用'\ e',但都无济于事。

2 个答案:

答案 0 :(得分:0)

试试这个

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

答案 1 :(得分:0)

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

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

此处,每个\都被视为字面反斜杠。

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