【问题标题】:QRegularExpression to Strip ANSI Control CodesQRegularExpression 去除 ANSI 控制代码
【发布时间】:2017-05-03 17:19:39
【问题描述】:

我正在使用正则表达式

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

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

【问题讨论】:

  • 尝试将其声明为auto re = QRegularExpression { R"\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mK]" };。如果它没有按预期工作,请尝试使用\x{1B} 而不是\x1B。
  • 请将输入字符串共享为字符串文字。
  • Wiktor 使用原始字符串的响应解决了问题。
  • SixDegrees,我发布了答案并进行了一些解释。请注意,[m|K] 也可能匹配 |。
  • 我在下面发布了答案。一旦您有时间,请随时接受/投票(接受有效答案您还将获得 2 分)。

标签: regex qt qregexp qregularexpression


【解决方案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;
}

您应该转义 [ ("\\[") 等符号。您可以在QRegularExpression 中同时使用"\x1b" 和"\\x1b"(在第一种情况下,它只是0x1b 符号)。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-10
      • 2012-03-03
      • 1970-01-01
      • 2017-08-28
      • 2015-04-04
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 2011-09-11
      相关资源
      最近更新 更多