java - 字符串替换对于第一次出现不起作用

标签 java apache-commons

我必须用文本和 json 值替换一些模板。

我的问题:第一个替换值未被替换。

我有以下代码:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.text.StringSubstitutor;

public class TestStringSubstitutor {

  public static void main(String[] args) {
    Map<String, String> parameters = new HashMap<>();
    Map<String, String> jsonParameters = new HashMap<>();
    parameters.put("entityId", "someid");
    parameters.put("name", "someName");
    parameters.put("now", ZonedDateTime.now().format(DateTimeFormatter.ISO_INSTANT).toString());

    jsonParameters.put("info", "{\"name\":\"John\",\"age\":30,\"car\":null}");


    String template = "{\"description\":\"this is ja unit test\",\"time\":\"{now}\",\"name\":\"{name}\",\"entityId\":\"{entityId}\",\"info\":\"{{info}}\"}";
    System.out.println("           template:" + template);

    String modMessage = StringSubstitutor.replace(template, parameters, "{", "}");
    System.out.println("replaced Message #1:" + modMessage);

    modMessage = StringSubstitutor.replace(modMessage, jsonParameters, "\"{{", "}}\"");
    System.out.println("replaced Message #2:" + modMessage);
  }

}

输出:

           template:{"description":"this is a unit test","time":"{now}","name":"{name}","entityId":"{entityId}","info":"{{info}}"}
replaced Message #1:{"description":"this is a unit test","time":"{now}","name":"someName","entityId":"someid","info":"{{info}}"}
replaced Message #2:{"description":"this is a unit test","time":"{now}","name":"someName","entityId":"someid","info":{"name":"John","age":30,"car":null}}
<小时/>

问题 {now} 应该被替换...

如果我更改模板的顺序:名称 <--> 时间

String template = "{\"description\":\"this is a unit test\",\"name\":\"{name}\",\"time\":\"{now}\",\"entityId\":\"{entityId}\",\"info\":\"{{info}}\"}";

然后输出发生变化,{now} 被替换,但第一个替换值 {name} 仍未被替换。

           template:{"description":"this is a unit test","name":"{name}","time":"{now}","entityId":"{entityId}","info":"{{info}}"}
replaced Message #1:{"description":"this is a unit test","name":"{name}","time":"2019-10-01T08:35:10.961177100Z","entityId":"someid","info":"{{info}}"}
replaced Message #2:{"description":"this is a unit test","name":"{name}","time":"2019-10-01T08:35:10.961177100Z","entityId":"someid","info":{"name":"John","age":30,"car":null}}

这是一个错误还是我错过了什么?

最佳答案

来自joakim-danielson的提示解决了问题。前缀“{”和后缀“}”不是唯一的。

现在使用“{{”和“}}”。

这是一个工作示例:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.text.StringSubstitutor;

public class TestStringSubstitutor {

  public static void main(String[] args) {
    Map<String, String> parameters = new HashMap<>();
    Map<String, String> jsonParameters = new HashMap<>();
    parameters.put("entityId", "someid");
    parameters.put("name", "someName");
    parameters.put("now", ZonedDateTime.now().format(DateTimeFormatter.ISO_INSTANT).toString());

    jsonParameters.put("info", "{\"name\":\"John\",\"age\":30,\"car\":null}");


    String template = "{\"name\":\"{{name}}\",\"time\":\"{{now}}\",\"entityId\":\"{{entityId}}\",\"info\":\"{{info}}\", \"description\":\"this is a unit test\"}";
    System.out.println("           template:" + template);

    String modMessage = StringSubstitutor.replace(template, parameters, "{{", "}}");
    System.out.println("replaced Message #1:" + modMessage);

    modMessage = StringSubstitutor.replace(modMessage, jsonParameters, "\"{{", "}}\"");
    System.out.println("replaced Message #2:" + modMessage);
  }

}

输出

           template:{"name":"{{name}}","time":"{{now}}","entityId":"{{entityId}}","info":"{{info}}", "description":"this is a unit test"}
replaced Message #1:{"name":"someName","time":"2019-10-01T10:56:54.991583700Z","entityId":"someid","info":"{{info}}", "description":"this is a unit test"}
replaced Message #2:{"name":"someName","time":"2019-10-01T10:56:54.991583700Z","entityId":"someid","info":{"name":"John","age":30,"car":null}, "description":"this is a unit test"}

关于java - 字符串替换对于第一次出现不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58181111/

相关文章:

java - 如何将元数据写入 .JPG?

java - 运行Servlet时出现异常: java. lang.ClassNotFoundException : javax. servlet.http.HttpServletRequest

java - 有什么方法可以从 Lambda 闭包中停止 Stream.generate 吗?

java - 正则表达式根据特定逗号拆分

java - CSVPrinter 仅从标题中删除引号

java - Apache Commons Lang 异常

java - 全部替换错误

java - 在Java中测试MongoDB : concurrency problems

java - 如何在 Java 中读取可以包含未知数量元素的 ;-separated CSV

java - 如何转换 ByteArrayOutputStream 以便使用 readline 循环