我有一个这样的字符串:“嗨,$namevar$,你好吗?”。我想要:

  • 提取占位符名称
  • 匹配另一个字符串,例如“Hi jhon doe 你好吗?”
  • 从测试字符串中提取“namevar”部分

  • 对于 1) 我使用以下代码:
    String my = "hi $namevar$ how are you?";
    Matcher m = Pattern.compile("\\$(\\w.*?)\\$").matcher(my);
    while (m.find()) {
        System.out.println(m.group(1));
    }
    

    有2)和3)的提示吗?

    最佳答案

    这是一种更通用的方法,不需要您提供模式,即可使用多个占位符,也可以在多个单词上匹配占位符。假设我们有以下模板和输入字符串:

    String input = "Hi John Doe, how are you? I'm Jane.";
    String template = "Hi $namevar$, how are you? I'm $namevar2$.";
    

    因此,我们首先解析所有占位符名称并将它们添加到 Map 中。我们使用 Map 以便稍后我们可以将实际的 String 值分配为键。
    Matcher m = Pattern.compile("\\$(\\w*?)\\$").matcher(template);
    Map<String, String> vars = new LinkedHashMap<String, String>();
    while (m.find()) {
        System.out.println(m.group(1));
        vars.put(m.group(1), null);
    }
    

    现在,我们生成模式来解析占位符值
    String pattern = template;
    // escape regex special characters
    pattern = pattern.replaceAll("([?.])", "\\\\$1");
    for (String var : vars.keySet()) {
        // replace placeholders with capture groups
        pattern = pattern.replaceAll("\\$"+var+"\\$", "([\\\\w\\\\s]+?)");
    }
    

    现在,我们进行匹配并捕获占位符值。然后将这些值存储在上面创建的相同 Map 中,分配给它们相应的占位符变量。
    m = Pattern.compile(pattern).matcher(input);
    if (m.matches()) {
        int i = 0;
        for (String var : vars.keySet()) {
            vars.put(var, m.group(++i));
        }
    }
    

    现在,让我们通过迭代 Map 来打印出我们捕获的值
    for (Map.Entry<String, String> entry : vars.entrySet()) {
        System.out.println(entry.getKey() + " = " + entry.getValue());
    }
    

    输出:
    namevar = John Doe
    namevar2 = Jane
    

    10-07 19:42
    查看更多