String 占位符替换 并发下 异常

举报
隔壁老汪 发表于 2022/06/24 00:40:11 2022/06/24
【摘要】 使用 string.format() 无上述现象 网上找的工具类有点问题,修改后如下 /** * Desc: 占位符替换, 占位符表示为:{@code {placeholder}}; * <p> * 示例:替换如下{xxx}占位符中的内容 * <pre>"名字:{name},年龄:{age},学...

使用 string.format()

无上述现象

网上找的工具类有点问题,修改后如下


  
  1. /**
  2. * Desc: 占位符替换, 占位符表示为:{@code {placeholder}};
  3. * <p>
  4. * 示例:替换如下{xxx}占位符中的内容
  5. * <pre>"名字:{name},年龄:{age},学校:{school}"</pre>
  6. */
  7. public class PlaceHolderReplaceUtils {
  8. private static final Pattern pattern = Pattern.compile("\\{(.*?)\\}");
  9. /**
  10. * 替换字符串占位符, 字符串中使用{key}表示占位符
  11. *
  12. * @param sourceString 需要匹配的字符串,示例:"名字:{name},年龄:{age},学校:{school}";
  13. * @param param 参数集,Map类型
  14. * @return
  15. */
  16. public static String replaceWithMap(String sourceString, Map<?, ?> param) {
  17. if (Strings.isNullOrEmpty(sourceString) || CollectionUtils.isEmpty(param)) {
  18. return sourceString;
  19. }
  20. String targetString = sourceString;
  21. Matcher matcher = pattern.matcher(sourceString);
  22. while (matcher.find()) {
  23. try {
  24. String key = matcher.group();
  25. String keyclone = key.substring(1, key.length() - 1).trim();
  26. Object value = param.get(keyclone);
  27. // log.info("最初 key: [{}], val: [{}]", keyclone , value);
  28. if (value != null) {
  29. targetString = targetString.replace(key, value.toString());
  30. // log.info("不为null key: [{}], val: [{}], targetString:[{}]", keyclone , value, targetString);
  31. }
  32. } catch (Exception e) {
  33. throw new RuntimeException("String formatter failed", e);
  34. }
  35. }
  36. return targetString;
  37. }
  38. /**
  39. * 替换字符串占位符, 字符串中使用{key}表示占位符
  40. * <p>
  41. * 利用反射 自动获取对象属性值 (必须有get方法)
  42. *
  43. * @param sourceString 需要匹配的字符串
  44. * @param param 参数集
  45. * @return
  46. */
  47. public static String replaceWithObject(String sourceString, Object param) {
  48. if (Strings.isNullOrEmpty(sourceString) || ObjectUtils.isEmpty(param)) {
  49. return sourceString;
  50. }
  51. String targetString = sourceString;
  52. PropertyDescriptor pd;
  53. Method getMethod;
  54. // 匹配{}中间的内容 包括括号
  55. Matcher matcher = pattern.matcher(sourceString);
  56. while (matcher.find()) {
  57. String key = matcher.group();
  58. String holderName = key.substring(1, key.length() - 1).trim();
  59. try {
  60. pd = new PropertyDescriptor(holderName, param.getClass());
  61. getMethod = pd.getReadMethod(); // 获得get方法
  62. Object value = getMethod.invoke(param);
  63. if (value != null) {
  64. targetString = targetString.replace(key, value.toString());
  65. }
  66. } catch (Exception e) {
  67. throw new RuntimeException("String formatter failed", e);
  68. }
  69. }
  70. return targetString;
  71. }
  72. /**
  73. * 查找String中的占位符keys;<br/>
  74. * 示例: "名字:{name},年龄:{age},学校:{school}", 则返回:Set[name,age,school]
  75. * <p>
  76. * pattern示例:
  77. * <pre> {@code
  78. * // 尖括号:<placeHolder> 表示为占位符
  79. * Pattern pattern = Pattern.compile("\\<(.*?)\\>");
  80. *
  81. * // 大括号:{placeHolder} 表示为占位符, 上面的示例中就使用{}作为占位符
  82. * Pattern pattern = Pattern.compile("\\{(.*?)\\}");
  83. * }
  84. * </pre>
  85. *
  86. * @param sourceString
  87. * @param pattern
  88. * @return
  89. */
  90. public static Set<String> findPlaceHolderKeys(String sourceString, Pattern pattern) {
  91. Set<String> placeHolderSet = Sets.newConcurrentHashSet();
  92. if (Strings.isNullOrEmpty(sourceString) || ObjectUtils.isEmpty(pattern)) {
  93. return placeHolderSet;
  94. }
  95. String targetString = sourceString;
  96. Matcher matcher = pattern.matcher(sourceString);
  97. while (matcher.find()) {
  98. String key = matcher.group(); //示例: {name}
  99. String placeHolder = key.substring(1, key.length() - 1).trim(); //示例: name
  100. placeHolderSet.add(placeHolder);
  101. }
  102. return placeHolderSet;
  103. }
  104. }

 

文章来源: blog.csdn.net,作者:隔壁老瓦,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/wxb880114/article/details/105867052

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。