我有一些简短的文本,可以包含 0 到 N 个参数,类似于 Web 应用程序的模板库。每个参数都可以有一个可选的默认值:
bla bla bla {{paramA=defaultValA}} bla bla {{paramB}} bla bla bla
参数的名称用于从字符串到字符串映射检索其字符串值。
我需要做的是将这些参数(包括 {{
、}}
和默认值(如果有))替换为该参数的值。
我的问题是,即使我设法将所有参数隔离到单独的字符串中:
{{paramA=defaultValA}}
{{paramB}}
并将它们替换为这些单独字符串中的值,我不知道如何将它们放回上面的原始输入字符串中。
假设我将参数值放入一个数组中,有没有办法进行某种“分别替换”,以便第 N 组(即第 N 个参数)被参数值数组中的第 N 个值替换?
谢谢:)
最佳答案
这是一个使用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
关于Java - 正则表达式,分别替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27927100/