带占位符的正则表达式

灰太狼82

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

  1. 提取占位符名称
  2. 与此字符串匹配另一个字符串,例如“嗨,jhon doe,你好吗?”
  3. 从测试字符串中提取“ 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第一个。我们使用aMap以便以后可以将实际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));
    }
}

现在,让我们通过遍历Mapas来打印捕获的值

for (Map.Entry<String, String> entry : vars.entrySet()) {
    System.out.println(entry.getKey() + " = " + entry.getValue());
}

输出:

namevar = John Doe
namevar2 = Jane

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章