我在替换字符串中的某些值时遇到了麻烦。
{"key1":"value1","key2":"value2","key3":"value3","key4":"djdhsja","BizProcessNm":"value5",.........}
我必须将key4的值替换为“something”。如下图所示
{"key1":"value1","key2":"value2","key3":"value3","key4":"something","BizProcessNm":"value5",.........}
问题是我不知道key4值内的确切值。在这种情况下,“djdhsja”是值。这将是随机的。
我想到了在字符串中获取key4的位置,然后根据字符串位置,在第一次“直到它以”某事“结束后替换内容。但这可能有点复杂,因为我必须这样做for循环中有如此多的字符串(循环由其他人编写,我只是修改它)。
在linux中是否有像sed那样的正则表达式查找和替换。
编辑:key4的位置是随机的
答案 0 :(得分:1)
如果我没弄错的话,你就有类似JSON的键值对。 在这种情况下,我会将json转换为java对象。有一些为此编写的库(例如https://github.com/FasterXML/jackson)。你可以简单地获取并设置该对象的字段。
如果是地图或类似内容,您仍然可以通过键“key4”获得“key4”的值。
最后,如果您还有其他内容,例如包含该内容的字符串,您可以使用以下内容:
yourString.split(",")[3].split(":")[1];
答案 1 :(得分:1)
假设键,冒号和值之间没有空格,并且当前值key4
内也没有引号,则可以使用以下代码行替换值:
s.replaceFirst("(?<=\\\"key4\\\":\\\")(.*?)(?=\\\")", "new value");
正则表达式使用正面后视和前瞻,以便只替换值的引号内的文本。
虽然这可能适用于一次性操作,但我建议使用JSON解析器,如评论和Marcell的回答所示。
答案 2 :(得分:1)
您可以将String转换为JSon Object,然后将该json转换为Map并执行您的任务,
Map map;
map = (Map) JSONObject.toBean(jsonObj, Map.class);
Iterator it = map.entrySet().iterator();
这里jsonObj
是json对象,它是从你的String值中得到的。
并在条件检查密钥时,更新特定密钥的值。