在 C# 字符串中如何替换忽略数字的两个字符

In C# string how to replace two chararacters ignoring a number

我正在编辑一个序列化字符串,因为反序列化时会出现解析错误。 所以我想从一个长的序列化字符串中编辑 "myVar\": \"0.2 mm""myVar\": \"0.2" 如果我使用下面的代码就可以了

string NewString = Serializedstring.Replace($"myVar\": \"0.2 mm", $"myVar\": \"0.2")

但我的 0.2 是一个变量,可能会随每次出现而变化。所以我只想从字符串 "myVar\": \"0.2 mm"

中删除 mm

我可以推荐 2 种替代方法

1)尽你所能。 var str = NewString.Replace(" mm,\"", ""); 如果您的字符串不会有 space 后跟 mm" 其他地方应该没问题。

2) 一个更安全的选择是将它反序列化为可以处理它的东西(我假设你当前将 属性 反序列化为一个数字)然后字符串替换 属性 并映射它到你需要的。

有很多方法可以做到这一点,正则表达式、字符串标记化、字符数组搜索

RegEx 可能最接近您目前正在做的事情 此处描述了正则表达式语法 Basics of RegEx

模式[0-9.]+应该匹配一个十进制数,但要注意它也会匹配任何包含数字和点的东西,比如ip地址 所以如果你有一个

的正则表达式
Regex rx = new Regex(@"([0-9.]+) mm")
<your string> = rx.Replace(<Your string>, @"");

详情如下:

  • [0-9.]任意数字或点

  • + 之前的一项或多项

  • ()特别感兴趣的群体

  • </code> 您要替换匹配的组的编号 注意 <code>[=16=] 是整个输入字符串

这将用数字的值替换任何 (number) mm 的字符串

如果您的 JSON 以两种不同的格式出现,与其尝试将 JSON 字符串破解成可用的格式,不如使用自定义 JsonConverter 更安全。例如:

public class MillimetreJsonConverter : JsonConverter<double>
{
    public override double Read(ref Utf8JsonReader reader, Type typeToConvert, 
        JsonSerializerOptions options)
    {
        // First try to get a double, if it works then simply return it
        if(reader.TryGetDouble(out var val))
        {
            return val;
        }
        
        // Otherwise we get the string value e.g. "0.2 mm" and
        // do some simple string manipulation on it
        var value = reader.GetString()!;
        value = value.Replace(" mm", "");
        
        if(double.TryParse(value, out var result))
        {
            return result;
        }

        // If we get here, perhaps we should throw an exception?
        return 0;
    }

    public override void Write(Utf8JsonWriter writer, double value, 
        JsonSerializerOptions options)
    {
        // You can fill this in if you need it
        throw new NotImplementedException();
    }
}

现在你可以修改 class 反序列化成,假设你的 JSON 看起来像这样 {"myVar": "0.2 mm"},:

public class Foo
{
    [JsonConverter(typeof(MillimetreJsonConverter))]
    public double myVar { get; set; }
}

最后,反序列化就简单了:

var foo = JsonSerializer.Deserialize<Foo>(json);