C# 非固定长度查找解决方案
考虑以下问题:C# 非固定长度查找解决方案,c#,json,regex,C#,Json,Regex,考虑以下问题: 第一: { “好”:{ “a”:“, “c”:“, “e”:” }, “坏”:{ “a”:“, “c”:“, “e”:” } } 第二: { "Good": { "a": "<kind of good>", "c": "<more good>", "e": "<the most good>" }, "Bad": { "a": "<a little bad>", "c": "<
第一:
{
“好”:{
“a”:“,
“c”:“,
“e”:”
},
“坏”:{
“a”:“,
“c”:“,
“e”:”
}
}
第二:
{
"Good": {
"a": "<kind of good>",
"c": "<more good>",
"e": "<the most good>"
},
"Bad": {
"a": "<a little bad>",
"c": "<more bad>",
"e": "<the most bad>"
}
}
{
“好”:{
“a”:“,
“c”:“,
“e”:”
},
“坏”:{
“a”:“,
“c”:“,
“e”:”
}
}
第三:
{
"Good": {
"a": "<good>",
"c": "<better>",
"e": "<best>"
},
"Bad": {
"a": "<bad>",
"c": "<better>",
"e": "<worst>"
}
}
{
“好”:{
“a”:“,
“c”:“,
“e”:”
},
“坏”:{
“a”:“,
“c”:“,
“e”:”
}
}
在所有情况下,我都必须从对象“Good”中提取属性“c”及其值,用该值进行一些操作,然后用新值替换旧值
问题在于对象“坏”。我对该对象的值不感兴趣,也不应该替换其中的任何内容。到目前为止,我想出了一个正则表达式:
(?<!Bad)"c": "(<.*?>)"
(?
显而易见的问题是,对象“Bad”的名称并没有立即位于属性“c”之前,而且它们之间的符号可能(和将)有所不同。而且,据我所知,lookbehind应该是固定长度的,所以我不能仅仅使用这样的东西:
(?<!Bad.*)"c": "(<.*?>)"
(?
我在C#中使用regex,所以我想只使用第一个实例,但它不是最可靠的解决方案,而且它仍然不能通过替换来解决问题
谈到替换。我想动态创建正则表达式以确保只替换正确的匹配项。但是对于第三个示例,这个技巧不起作用,因为“c”:“()”
将在对象“Good”和“Bad”中匹配
有人能帮我吗?你可以使用JSON.NET解析JSON。因为你知道JSON中有一个特定的值,你可以使用一个简单的代码(这里,用括号括住e
值):
你为什么要用正则表达式而不是用JSON解析器,比如,或?@dbc,这是一个很好的问题。这一切开始很简单,然后变成了这个怪物;也许,我真的不需要用正则表达式来解析它。不过,如果有一种正确的方法用正则表达式来解析它,我会很高兴知道的。你不能rse JSON使用.NET正则表达式而不平衡表达式,与使用实际的JSON解析器相比,这是一个很大的工作量。谢谢,@Ryan,我想我必须这样做。是的,似乎是我要使用的方向。谢谢你,Wiktor!
(?<!Bad.*)"c": "(<.*?>)"
dynamic parsedObject = Newtonsoft.Json.JsonConvert.DeserializeObject(data);
parsedObject["Good"]["e"] = $"({parsedObject["Good"]["e"]})";
var res = parsedObject.ToString();