简体   繁体   中英

Apache StringSubstitutor - Replace not matching variables with empty string

Precondition

I have a string which looks like this: String myText= "This is a foo text containing ${firstParameter} and ${secondParameter}"

And the code looks like this:

Map<String, Object> textParameters=new Hashmap<String,String>();
textParameters.put("firstParameter", "Hello World");
StringSubstitutor substitutor = new StringSubstitutor(textParameters);
String replacedText = substitutor.replace(myText)

The replacedText will be: This is a foo text containing Hello World and ${secondParameter}

The problem

In the replaced string the secondParameter parameter was not provided so for this reason the declaration was printed out.

What I want to achieve?

If a parameter is not mapped then I want to hide its declaration by replacing it with an empty string.

In the example I want to achieve this: This is a foo text containing Hello World and

Question

How can I achieve the mentioned result with StringUtils/Stringbuilder? Should I use regex instead?

You can achieve this by supplying your placeholder with a default value by appending :- to it. (For example ${secondParameter:-my default value} ).

In your case, you can also leave it empty to hide the placeholder if the key is not set.

String myText = "This is a foo text containing ${firstParameter} and ${secondParameter:-}";
Map<String, Object> textParameters = new HashMap<>();
textParameters.put("firstParameter", "Hello World");
StringSubstitutor substitutor = new StringSubstitutor(textParameters);
String replacedText = substitutor.replace(myText);
System.out.println(replacedText);
// Prints "This is a foo text containing Hello World and "

If you want to set default value for all variables, you can construct StringSubstitutor with StringLookup , where the StringLookup just wrap the parameter map and use getOrDefault to provide your default value.


import org.apache.commons.text.StringSubstitutor;
import org.apache.commons.text.lookup.StringLookup;

import java.util.HashMap;
import java.util.Map;

public class SubstituteWithDefault {
    public static void main(String[] args) {
        String myText = "This is a foo text containing ${firstParameter} and ${secondParameter}";
        Map<String, Object> textParameters = new HashMap<>();
        textParameters.put("firstParameter", "Hello World");
        StringSubstitutor substitutor = new StringSubstitutor(new StringLookup() {
            @Override
            public String lookup(String s) {
                return textParameters.getOrDefault(s, "").toString();
            }
        });
        String replacedText = substitutor.replace(myText);
        System.out.println(replacedText);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM