如何从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
相关产品推荐
相关产品推荐

