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

如何从JSON字符串中移除转义的不可打印字符?

问题根源与解决方案

你的问题核心在于:拿到的JSON字符串里的\u001f、\u0001是转义后的字符串表示,不是实际的不可打印控制字符。

原始代码里的正则[^\u0020-\u007E]是用来匹配实际的ASCII控制字符(比如十进制0-31、127的字符),但此时你的字符串中,这些"控制字符"其实是由\、u、数字/字母组成的普通可打印字符(比如\\u001f实际是\+u+0+0+1+f),所以正则根本抓不到它们。

两种解决思路

思路1:先解析JSON,再清理字符

这是更规范的做法,先把转义的JSON字符串解析成实际对象,此时\uXXXX会被转换成对应的真实字符,再用你的正则清理:

// 原始输入字符串
string rawJson = "{\"Name\":\"\\u001f\\u001f!#$%&'%\\u0001\"}";

// 用System.Text.Json解析JSON
using JsonDocument doc = JsonDocument.Parse(rawJson);
string nameValue = doc.RootElement.GetProperty("Name").GetString();

// 清理不可打印字符
string cleanedName = Regex.Replace(nameValue, @"[^\u0020-\u007E]", string.Empty);

// 重新生成清理后的JSON(可选)
string cleanedJson = JsonSerializer.Serialize(new { Name = cleanedName });

思路2:直接匹配字符串中的\uXXXX格式控制字符

如果不想解析整个JSON,可以直接匹配字符串里的\uXXXX格式,判断其对应的字符是否为不可打印控制字符,再替换:

string rawJson = "{\"Name\":\"\\u001f\\u001f!#$%&'%\\u0001\"}";

string cleanedJson = Regex.Replace(rawJson, @"\\u([0-7A-Fa-f]{4})", match => {
    int charCode = Convert.ToInt32(match.Groups[1].Value, 16);
    // 只移除ASCII控制字符(0x00-0x1F 或 0x7F)
    if (charCode <= 0x1F || charCode == 0x7F)
    {
        return string.Empty;
    }
    // 其他合法的\u转义字符保留原样
    return match.Value;
});

内容的提问来源于stack exchange,提问作者Alex Kvitchastyi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:57:25