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

标签 java regex string replace

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

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

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

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

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

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

假设我将参数值放入一个数组中,有没有办法进行某种“分别替换”,以便第 N 组(即第 N 个参数)被参数值数组中的第 N 个值替换?

谢谢:)

最佳答案

这是一个使用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

关于Java - 正则表达式,分别替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27927100/

相关文章:

c - 如何将字符串分配给 char* 指针?

java - 将 "double"添加到 List<Double> doubleList

java - 构造函数实际上可以返回字符串吗?

Java,如何解析 JSON 进行地理定位?

java - 如何使用 Java 正则表达式强制某些字符串以新行开头?

ruby - Parslet:识别给定关键字以外的任何内容

python - 用于额外字段的正则表达式

c++ - 生成与集合中的字符串不匹配的字符串

java - java oracle 教程中带有锁对象的 Bow/Bower 示例

Java 从文件中读取。结果不好