我有一个这样的字符串:“嗨,$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