You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现判断字符串是否为ANSI转义序列的C++函数?

判断字符串是否为ANSI转义序列的C++实现

完全可以实现这样的判断函数。ANSI转义序列的核心特征是以ESC字符(ASCII码27,即\033)开头,后续跟着不同格式的字符组合,常见类型包括CSI控制序列(如\033[0m)、OSC操作序列、单字符转义等。

以下是覆盖大部分常见场景的实用实现:

#include <string>
#include <cctype>

bool is_ansi_escape_sequence(const std::string& str) {
    // 空字符串或不以ESC开头直接排除
    if (str.empty() || str[0] != '\033') {
        return false;
    }
    // 仅单个ESC字符不算有效序列
    if (str.size() < 2) {
        return false;
    }

    // 处理最常见的CSI序列(格式:ESC [ 参数 终止字符)
    if (str[1] == '[') {
        // 遍历寻找合法终止字符(A-Z/a-z/@/^/_)
        for (size_t i = 2; i < str.size(); ++i) {
            char c = str[i];
            if (std::isalpha(static_cast<unsigned char>(c)) || c == '@' || c == '^' || c == '_') {
                return true;
            }
            // 参数部分仅允许数字和分号,遇到其他字符终止遍历
            if (!std::isdigit(static_cast<unsigned char>(c)) && c != ';') {
                break;
            }
        }
    }
    // 处理OSC、DCS等其他类型序列(以ESC ]/P/X/(/)开头)
    else if (str[1] == ']' || str[1] == 'P' || str[1] == 'X' || str[1] == '(' || str[1] == ')') {
        // 这类序列至少需要后续字符(简化判断,完整实现可补充标准终止规则)
        return str.size() > 2;
    }
    // 处理单字符转义(如ESC c 重置终端)
    else {
        return str.size() == 2;
    }

    return false;
}

测试示例

  • 输入std::string("\033[0m"),函数返回true
  • 输入普通字符串"hello",函数返回false
  • 输入单字符转义序列"\033c",函数返回true

内容的提问来源于stack exchange,提问作者Gianluca Bianco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 07:09:20