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);
}
}
先决条件
我有一个如下所示的字符串:
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);
}
}