String 占位符替换 并发下 异常
【摘要】
使用 string.format()
无上述现象
网上找的工具类有点问题,修改后如下
/** * Desc: 占位符替换, 占位符表示为:{@code {placeholder}}; * <p> * 示例:替换如下{xxx}占位符中的内容 * <pre>"名字:{name},年龄:{age},学...
使用 string.format()
无上述现象
网上找的工具类有点问题,修改后如下
-
/**
-
* Desc: 占位符替换, 占位符表示为:{@code {placeholder}};
-
* <p>
-
* 示例:替换如下{xxx}占位符中的内容
-
* <pre>"名字:{name},年龄:{age},学校:{school}"</pre>
-
*/
-
public class PlaceHolderReplaceUtils {
-
private static final Pattern pattern = Pattern.compile("\\{(.*?)\\}");
-
/**
-
* 替换字符串占位符, 字符串中使用{key}表示占位符
-
*
-
* @param sourceString 需要匹配的字符串,示例:"名字:{name},年龄:{age},学校:{school}";
-
* @param param 参数集,Map类型
-
* @return
-
*/
-
public static String replaceWithMap(String sourceString, Map<?, ?> param) {
-
if (Strings.isNullOrEmpty(sourceString) || CollectionUtils.isEmpty(param)) {
-
return sourceString;
-
}
-
String targetString = sourceString;
-
Matcher matcher = pattern.matcher(sourceString);
-
while (matcher.find()) {
-
try {
-
String key = matcher.group();
-
String keyclone = key.substring(1, key.length() - 1).trim();
-
Object value = param.get(keyclone);
-
// log.info("最初 key: [{}], val: [{}]", keyclone , value);
-
if (value != null) {
-
targetString = targetString.replace(key, value.toString());
-
// log.info("不为null key: [{}], val: [{}], targetString:[{}]", keyclone , value, targetString);
-
}
-
-
} catch (Exception e) {
-
throw new RuntimeException("String formatter failed", e);
-
}
-
}
-
return targetString;
-
}
-
/**
-
* 替换字符串占位符, 字符串中使用{key}表示占位符
-
* <p>
-
* 利用反射 自动获取对象属性值 (必须有get方法)
-
*
-
* @param sourceString 需要匹配的字符串
-
* @param param 参数集
-
* @return
-
*/
-
public static String replaceWithObject(String sourceString, Object param) {
-
if (Strings.isNullOrEmpty(sourceString) || ObjectUtils.isEmpty(param)) {
-
return sourceString;
-
}
-
String targetString = sourceString;
-
PropertyDescriptor pd;
-
Method getMethod;
-
// 匹配{}中间的内容 包括括号
-
Matcher matcher = pattern.matcher(sourceString);
-
while (matcher.find()) {
-
String key = matcher.group();
-
String holderName = key.substring(1, key.length() - 1).trim();
-
try {
-
pd = new PropertyDescriptor(holderName, param.getClass());
-
getMethod = pd.getReadMethod(); // 获得get方法
-
Object value = getMethod.invoke(param);
-
if (value != null) {
-
targetString = targetString.replace(key, value.toString());
-
}
-
} catch (Exception e) {
-
throw new RuntimeException("String formatter failed", e);
-
}
-
}
-
return targetString;
-
}
-
/**
-
* 查找String中的占位符keys;<br/>
-
* 示例: "名字:{name},年龄:{age},学校:{school}", 则返回:Set[name,age,school]
-
* <p>
-
* pattern示例:
-
* <pre> {@code
-
* // 尖括号:<placeHolder> 表示为占位符
-
* Pattern pattern = Pattern.compile("\\<(.*?)\\>");
-
*
-
* // 大括号:{placeHolder} 表示为占位符, 上面的示例中就使用{}作为占位符
-
* Pattern pattern = Pattern.compile("\\{(.*?)\\}");
-
* }
-
* </pre>
-
*
-
* @param sourceString
-
* @param pattern
-
* @return
-
*/
-
public static Set<String> findPlaceHolderKeys(String sourceString, Pattern pattern) {
-
Set<String> placeHolderSet = Sets.newConcurrentHashSet();
-
if (Strings.isNullOrEmpty(sourceString) || ObjectUtils.isEmpty(pattern)) {
-
return placeHolderSet;
-
}
-
String targetString = sourceString;
-
Matcher matcher = pattern.matcher(sourceString);
-
while (matcher.find()) {
-
String key = matcher.group(); //示例: {name}
-
String placeHolder = key.substring(1, key.length() - 1).trim(); //示例: name
-
placeHolderSet.add(placeHolder);
-
}
-
return placeHolderSet;
-
}
-
}
文章来源: blog.csdn.net,作者:隔壁老瓦,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/wxb880114/article/details/105867052
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)