我有一小段文本,可以包含0到N个参数,类似于Web应用程序的模板库。每个参数都可以有一个可选的默认值:
bla bla bla {{paramA=defaultValA}} bla bla {{paramB}} bla bla bla
参数的名称用于从字符串到字符串映射检索其字符串值。
我需要做的是将这些参数(包括{{
,}}
和默认值(如果有))替换为该参数的值。
我的问题是,即使我设法将所有参数隔离成单独的字符串:
{{paramA=defaultValA}}
{{paramB}}
并用它们在这些单独字符串中的值替换它们,我不知道如何将它们放回到上面的原始输入字符串中。
假设我将参数值放在数组中,是否有办法进行某种“分别替换”,以便第N组(即第N个参数)被参数值数组中的第N个值替换? / p>
谢谢:)
答案 0 :(得分:3)
您可以使用appendReplacement
来执行此操作。
E.g:
String str = "bla bla bla {{paramA=defaultValA}} bla bla {{paramB}} bla bla bla";
Map<String, Object> params = new HashMap<String, Object>();
params.put("paramA", null);
params.put("paramB", "toto");
String param;
String defaultValue;
int index;
Pattern pattern = Pattern.compile("\\{\\{(.*?)\\}\\}");
Matcher matcher = pattern.matcher(str);
StringBuffer strb = new StringBuffer();
while (matcher.find()) {
defaultValue = "";
param = matcher.group(1);
if (param.contains("=")) {
index = param.indexOf("=");
defaultValue = param.substring(index + 1, param.length());
param = param.substring(0, index);
}
Object ob = params.get(param);
String value = ob != null ? ob.toString() : defaultValue;
matcher.appendReplacement(strb, value);
}
matcher.appendTail(strb);
System.out.println(strb);
输出:
bla bla bla defaultValA bla bla toto bla bla bla
答案 1 :(得分:2)
这是一个简单的&amp;使用Pattern
和Matcher
:
// the map of values
Map<String, String> map = new HashMap<String, String>();
// adding paramB only
map.put("paramB", "Foo!");
String text = "bla bla bla {{paramA=defaultValA}} bla bla {{paramB}} bla bla bla";
// | escaped curly brackets
// | | group 1: key
// | | | group 2: optional =defaultValue
// | | | | group3: default value if any
// | | | | | escaped closing curly brackets
Pattern p = Pattern.compile("\\{\\{(\\w+)(=(\\w+))?\\}\\}");
Matcher m = p.matcher(text);
// StringBuilder to build populated output
StringBuilder output = new StringBuilder();
// keeping track of index for matching, starting at 0
int start = 0;
while (m.find()) {
// adding to output so far
output.append(text.substring(start, m.start()));
// index is now end of match
start = m.end();
// paramX
String key = m.group(1);
// default value
String defaultValue = m.group(3);
// is in map?
String value = map.get(key);
// yes
if (value != null) {
output.append(value);
}
// not in map, checking for default value
else if (defaultValue != null) {
output.append(defaultValue);
}
// adding placeholder for no value found
else {
output.append("[value not found]");
}
}
// adding text after last match
output.append(text.substring(start));
System.out.println(output);
<强>输出强>
bla bla bla defaultValA bla bla Foo! bla bla bla