Java字符串每次为一个键查找和替换不同的值

时间:2017-06-19 09:23:51

标签: java

我在替换字符串中的某些值时遇到了麻烦。

{"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的位置是随机的

3 个答案:

答案 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值中得到的。

并在条件检查密钥时,更新特定密钥的值。