【问题标题】:How to interpolate variables within a string using HashMap as variable source如何使用 HashMap 作为变量源在字符串中插入变量
【发布时间】:2020-03-30 12:29:14
【问题描述】:

假设我们有一个字符串:string text = "Hello my name is $$name; and my surname is $$surname;"

它引用了 2 个变量,由双美元符号标识:namesurname

我们还有一个哈希图:

HashMap<String, String> variables = new HashMap<String, String>();
variables.put("name", "John");
variables.put("surname", "Doe");

如何使用匹配的正则表达式值作为哈希映射键替换/插入字符串中的变量? (也许不需要使用Regex,Java有这个实现)

最后,我希望变量 string text 等于 "Hello my name is John and my surname is Doe"

编辑:我的意思是在不知道密钥的情况下用哈希映射值替换密钥/变量。例如,我们有一个字符串,我们必须将其中的所有 $$variable; 值替换为 map[variable]

替换这个字符串最快的方法是什么?

【问题讨论】:

  • 您可以使用简单的查找/替换。或者选择成熟的模板引擎。如果您的地图中缺少变量,如何处理,如何输出双美元等问题......

标签: java regex string hashmap


【解决方案1】:

您必须使用一些正则表达式,解析输入并查找 Map 中的每个键,如下所示:

import java.util.Map;
import java.util.regex.Pattern;

public class T2 {
    /** Pattern for the variables syntax */
    public static final Pattern PATTERN = Pattern.compile("\\$\\$([a-zA-Z]+);");

    public static void main(String[] args) {
        String s = "Hello my name is $$name; and my surname is $$surname;";
        Map<String, String> variables = Map.of("name", "John", "surname", "Doe");
        String ret = replaceVariables(s, variables);
        System.out.println(ret);
    }

    private static String replaceVariables(final CharSequence s, final Map<? super String, String> variables) {
        return PATTERN.matcher(s).replaceAll(mr -> variables.getOrDefault(mr.group(1), ""));
    }

}

输出:

你好,我叫约翰,我姓杜

【讨论】:

    【解决方案2】:

    您可以使用 foreach 循环遍历 variables 并将匹配的键替换为相应的值,而无需知道键。

    for(Map.Entry<String, String> e: variables.entrySet()) {
        text = text.replace("$$"+e.getKey(), e.getValue());
    }
    

    试试这个:

    String text = "Hello my name is $$name; and my surname is $$surname;";
    
    Map<String, String> variables = new HashMap<>();
    variables.put("name", "John");
    variables.put("surname", "Doe");
    
    for(Map.Entry<String, String> e: variables.entrySet()) {
        text = text.replace("$$"+e.getKey(), e.getValue());
    }
    
    System.out.println(text);
    

    输出:

    Hello my name is John; and my surname is Doe;
    

    【讨论】:

      猜你喜欢
      • 2019-02-08
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多