如何在不使用更多字符串对象的情况下立即使用replace方法替换多个字符串

时间:2017-11-06 10:35:10

标签: java

我接受了字符串测试"{\"userName\": \"<userName>\",\"firstName\": \"<firstName>\",\"lastName\": \"<lastName>\"}"。我想要的是我想用动态值替换尖括号中的东西。示例代码:

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String toBeReplaced0 = "alpha";
        String toBeReplaced1 = "beta";
        String toBeReplaced2 = "gama";

        String test = "{\"userName\": \"<userName>\",\"firstName\": \"<firstName>\",\"lastName\": \"<lastName>\"}";

    }

}

现在,在此代码中,我想将<userName>替换为alpha,将<firstName>替换为beta,将<lastName>替换为gama,而不是多个字符串对象。这不是一个家庭作业问题。 test字符串中可以包含更多角度元素,以填充动态值。我怎么能用替换方法或其他任何东西来做到这一点..

3 个答案:

答案 0 :(得分:1)

如果是JSON,我宁愿使用a JSON library动态构造结果字符串并减轻任何可能的语法错误。

如果您真的想使用String.replaceAll()或类似内容,我不希望在上述限制范围内成为问题。只需将您的通话链接在一起(例如see this tutorial

请注意,字符串是 immutable ,因此如果不创建新的字符串对象,就无法轻松完成此操作。如果这真的是一个问题,也许你需要修改一个字符数组(但是当替换不同长度的多个不同于其占位符的字符串时,这将是一项非常重要的任务。)

简单地:

String result = orig.replace("<userName>", "replacement");

(不要忘记字符串是不可变的,所以你必须使用从这个调用返回的结果)

答案 1 :(得分:1)

Matcher.appendReplacement可以是一个选项。例如:

public static void main(String[] args){
    String toBeReplaced0 = "alpha";
    String toBeReplaced1 = "beta";
    String toBeReplaced2 = "gama";
    String test = "{\"userName\": \"<userName>\",\"firstName\": \"<firstName>\",\"lastName\": \"<lastName>\"}";
    System.out.println(findAndReplace(test,toBeReplaced0,toBeReplaced1,toBeReplaced2));        
}
public static String findAndReplace(String original, String... replacments){
    Pattern p = Pattern.compile("<[^<]*>");
    Matcher m1 = p.matcher(original);
    // count the matches
    int count = 0;
    while (m1.find()){
        count++; 
    }
    // if matches count equals replacement params length replace in the given order
    if(count == replacments.length){
        Matcher m = p.matcher(original);
        StringBuffer sb = new StringBuffer();
        int i = 0;
        while (m.find()) {
            m.appendReplacement(sb, replacments[i]);
            i++;
        }
        m.appendTail(sb);            
        return sb.toString();
    }
    //else return original
    return original;
}

答案 2 :(得分:1)

我会用StringTemplate library做到这一点。您的示例开箱即用:

    <dependency>
        <groupId>org.antlr</groupId>
        <artifactId>ST4</artifactId>
        <version>4.0.8</version>
        <scope>compile</scope>
    </dependency>

    // Given
    final ST template = new ST("{\"userName\": \"<userName>\",\"firstName\": \"<firstName>\",\"lastName\": \"<lastName>\"}");
    template.add("userName", "alpha");
    template.add("firstName", "beta");
    template.add("lastName", "gamma");
    // When
    final String result = template.render();
    // Then
    Assert.assertEquals("{\"userName\": \"alpha\",\"firstName\": \"beta\",\"lastName\": \"gamma\"}", result);