Java - 正则表达式,分别替换

时间:2015-01-13 16:41:20

标签: java regex string replace

我有一小段文本,可以包含0到N个参数,类似于Web应用程序的模板库。每个参数都可以有一个可选的默认值:

bla bla bla {{paramA=defaultValA}} bla bla {{paramB}} bla bla bla

参数的名称用于从字符串到字符串映射检索其字符串值。 我需要做的是将这些参数(包括{{}}和默认值(如果有))替换为该参数的值。

我的问题是,即使我设法将所有参数隔离成单独的字符串:

{{paramA=defaultValA}}
{{paramB}}

并用它们在这些单独字符串中的值替换它们,我不知道如何将它们放回到上面的原始输入字符串中。

假设我将参数值放在数组中,是否有办法进行某种“分别替换”,以便第N组(即第N个参数)被参数值数组中的第N个值替换? / p>

谢谢:)

2 个答案:

答案 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;使用PatternMatcher

的脏解决方案
// 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