Java实现占位符名称替换值
占位符现在应该说是比较流行的动态赋值,本文主要介绍了Java占位符名称替换值,根据一串带着参数名占位符的url,替换掉对应参数名的值
如果有这样一个字符串
String info="我叫{0},我爱吃{1},我今年{2}岁";
你会怎么处理这个问题呢?
这是一个比较简单的Java占位符操作
我们可以使用 MessageFormat.format去操作,用他去转换(替换占位符)
完整代码如下
package com.wyh.utils;
import java.text.MessageFormat;
/**
* @description: 测试占位符
* @author: 魏一鹤
* @createDate: 2022-08-08 21:45
**/
public class Test {
public static void main(String[] args){
String info="我叫{0},我爱吃{1},我今年{2}岁";
System.out.println(MessageFormat.format(info, "张三丰", "火锅", "18"));
}
}
运行结果如下,没有问题,有的复杂点的可能需要用过’'去进行转义
上述说的是最简单的一种转义,如果业务复杂点呢,比如有的模板就喜欢用这种占位符
比如我们通常会使用这种方式,用变量来做占位符
String info="我叫{name},我爱吃{food},我今年{age}岁";
这个时候再用上面的解决方式还行吗,测试下
很明显是不行的,直接就报错
Exception in thread “main” java.lang.IllegalArgumentException: can’t parse argument number: name
报错的原因很简单,无法解析参数占位符,这个时候怎么办呢?别急 继续看
我们写一个专门的工具类,用来替换掉对应参数名的值
工具类代码如下
package com.hmdp.utils;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @description: 替换参数占位符工具类
* @author: 魏一鹤
* @createDate: 2022-08-08 22:02
**/
public class StringFormatUtil {
private static final Pattern pattern = Pattern.compile("\\{(.*?)\\}");
private static Matcher matcher;
/**
* 格式化字符串 字符串中使用{key}表示占位符
*
* @param sourStr
* 需要匹配的字符串
* @param param
* 参数集
* @return
*/
public static String format(String sourStr, Map<String, Object> param) {
String tagerStr = sourStr;
if (param == null)
return tagerStr;
try {
matcher = pattern.matcher(tagerStr);
while (matcher.find()) {
String key = matcher.group();
String keyclone = key.substring(1, key.length() - 1).trim();
Object value = param.get(keyclone);
if (value != null)
tagerStr = tagerStr.replace(key, value.toString());
}
}catch (Exception e){
return null;
}
return tagerStr;
}
}
然后再次测试,使用我们工具类里面的方法进行转化参数占位符
package com.hmdp.utils;
import java.util.HashMap;
/**
* @description: 测试转义符
* @author: 魏一鹤
* @createDate: 2022-08-08 21:57
**/
public class Test2 {
public static void main(String[] args){
// 需要解析的字符串
String info="我叫{name},我爱吃{food},我今年{age}岁";
// 把全局的参数占位符放到map中进行解析
HashMap<String,Object> map = new HashMap();
map.put("name","张三");
map.put("food","西红柿");
map.put("age","100");
System.out.println(StringFormatUtil.format(info, map));
}
}
发现结果正是我们想要的
以上就是解决占位符的解决方式
欢迎大家评论留言,如果此文能够帮助到大家,那就是对我最大的鼓励!