在 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);
我正在编辑一个序列化字符串,因为反序列化时会出现解析错误。
所以我想从一个长的序列化字符串中编辑 "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);