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

C#调用Regex.Unescape无法移除字符串转义序列问题求助

问题原因

你调用Regex.Unescape没生效的核心原因是:从API拿到的字符串里的\n、\f是字面量组合(也就是实际存储的是\字符加n字符两个字节),而不是C#语法里编译后代表换行/换页的单字节转义字符。Regex.Unescape的设计目标是处理正则表达式语法里的转义字符,没法直接处理这种普通字符串里的字面转义序列。

解决方案

用正则匹配所有常见的转义序列,再通过匹配委托统一转换为对应的控制字符即可,不需要硬编码每个转义字符的独立替换规则:

using System.Text.RegularExpressions;

// 匹配所有标准格式的转义序列
var escapeRegex = new Regex(@"\\([btnfr""'\\]|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{2}|[0-7]{1,3})");
// 这里是从API拿到的原始字符串
string rawApiStr = "A strange seed was\\nplanted on its\\nback at birth.\\fThe plant sprouts\\nand grows with\\nthis POKéMON.";

string processedStr = escapeRegex.Replace(rawApiStr, match =>
{
    string seq = match.Value;
    return seq switch
    {
        @"\b" => "\b",
        @"\t" => "\t",
        @"\n" => "\n",
        @"\f" => "\f",
        @"\r" => "\r",
        @"\""" => "\"",
        @"\'" => "'",
        @"\\" => "\\",
        var s when s.StartsWith(@"\u") => ((char)Convert.ToUInt16(s[2..], 16)).ToString(),
        var s when s.StartsWith(@"\x") => ((char)Convert.ToByte(s[2..], 16)).ToString(),
        var s when char.IsDigit(s[1]) => ((char)Convert.ToUInt16(s[1..], 8)).ToString(),
        _ => seq
    };
});

适配说明

该方案默认覆盖了绝大多数通用转义场景:普通控制字符转义、Unicode转义、十六进制转义、八进制转义。如果后续API返回的转义序列有新增的自定义规则,只需要在switch分支中补充对应的映射关系即可,不需要修改整体匹配逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:48:04