Apache StringSubstitutor - 用空字符串替换不匹配的变量

Apache StringSubstitutor - Replace not matching variables with empty string

先决条件

我有一个如下所示的字符串: String myText= "This is a foo text containing ${firstParameter} and ${secondParameter}"

代码如下所示:

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

replacedText 将是: This is a foo text containing Hello World and ${secondParameter}

问题

在被替换的字符串中,未提供 secondParameter 参数,因此打印了声明。

我想达到什么目的?

如果参数未映射,那么我想通过用空字符串替换它来隐藏它的声明。

在示例中我想实现这个:This is a foo text containing Hello World and

问题

如何使用 StringUtils/Stringbuilder 达到上述结果?我应该改用正则表达式吗?

您可以通过向占位符附加 :- 为其提供默认值来实现此目的。 (例如 ${secondParameter:-my default value})。

对于您的情况,如果未设置键,您也可以将其留空以隐藏占位符。

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 "

如果你想为所有变量设置默认值,你可以构造StringSubstitutor with StringLookup,其中StringLookup只是包装参数映射并使用getOrDefault提供你的默认值。


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);
    }
}