概述

占位符替换, 占位符表示为:{placeholder};

示例:替换如下{xxx}占位符中的内容

"名字:{name},年龄:{age},学校:{school}"

提供了两种不同的替换方式:

  1. 使用Map对占位符的内容进行替换;
  2. 使用POJO对象,对占位符中的内容替换;

代码

import com.google.common.base.Strings;
import com.google.common.collect.Sets;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils; import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern; /**
* Desc: 占位符替换, 占位符表示为:{@code {placeholder}};
* <p>
* 示例:替换如下{xxx}占位符中的内容
* <pre>"名字:{name},年龄:{age},学校:{school}"</pre>
*/
public class PlaceHolderReplaceUtils {
private static final Pattern pattern = Pattern.compile("\\{(.*?)\\}");
private static Matcher matcher; /**
* 替换字符串占位符, 字符串中使用{key}表示占位符
*
* @param sourceString 需要匹配的字符串,示例:"名字:{name},年龄:{age},学校:{school}";
* @param param 参数集,Map类型
* @return
*/
public static String replaceWithMap(String sourceString, Map<String, Object> param) {
if (Strings.isNullOrEmpty(sourceString) || CollectionUtils.isEmpty(param)) {
return sourceString;
} String targetString = sourceString;
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);
if (value != null) {
targetString = targetString.replace(key, value.toString());
}
} 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 = 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 = 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;
} }

测试代码

package com.chinamobile.epic.regex;

import com.google.common.collect.Maps;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.junit.Test; import java.util.Map; public class PlaceHolderReplaceUtilsTest {
@Test
public void replaceWithMap() throws Exception {
String sourStr = "名字:{name},{name},年龄:{age},{school},学校:{school}";
Map<String, Object> map = Maps.newHashMap();
map.put("name", "Tom");
map.put("age", 27);
map.put("school", "Beijing");
String tagerStr = PlaceHolderReplaceUtils.replaceWithMap(sourStr, map);
System.out.println(tagerStr);
} @Test
public void replaceWithObject() throws Exception {
String sourStr = "名字:{name},{name},年龄:{age},{school},学校:{school}";
Person person = new Person("ZhangSan", "Suzhou", 45); String tagerStr = PlaceHolderReplaceUtils.replaceWithObject(sourStr, person);
System.out.println(tagerStr);
} @Data
@AllArgsConstructor
public static class Person {
private String name;
private String school;
private int age;
} }

结果输出

名字:ZhangSan,ZhangSan,年龄:45,Suzhou,学校:Suzhou
名字:Tom,Tom,年龄:27,Beijing,学校:Beijing

【占位符替换】替换String中的占位符标志位{placeholder}的更多相关文章

  1. 替换SQL字段中的换行符,回车符

    替换SQL字段中的换行符,回车符: 在富文本内容中通常会出现回车.换行内容.在sql数据库中这些回车.换行符,输出html后,表现为空格. 这里是在数据导出.导入中发现的,通常把回车.换行符找出来,用 ...

  2. 将html中的br换行符转换为文本输入中的换行符(转)

    PHP中的有个非常好的函数:nl2br(),将文本框中的换行转换为HTML页面的<br />,但是如何实现将html中的<br />换行符转换为文本框中的换行符呢?下面这几个方 ...

  3. php函数nl2br的反函数br2nl 将html中的br换行符转换为文本输入中的换行符

    下面这几个方法将能够帮你解决这个问题. PHP版将html中的<br />换行符转换为文本框中的换行符: 代码如下: function br2nl($text){ return preg_ ...

  4. 安卓编程资源文件string中对占位符的使用详解

    这里将为你详细介绍占位符的使用,将其学以致用,可以达到简化布局文件,减少字符串资源量. 1.在资源文件中的使用. 打开资源文件中的strings.xml文件,进行编辑.如下图所示: 图  1.0 2. ...

  5. SQL Server之替换文本内容中的回车符和换行符

    UPDATE 表 SET 栏位A = REPLACE(栏位A, CHAR(10), '') UPDATE表 SET 栏位A = REPLACE(栏位A, CHAR(13), '')

  6. 【正则表达式】使用正则表达式的group,查找出String中的参数值

    需求 指标基本格式: clm.{type}.{hostId}.$metricItem 示例1: // 待匹配表达式:<hostId: 为36位的UUID> summarize(clm.pm ...

  7. string中常用的函数

    string中常用的函数 发现在string在处理这符串是很好用,就找了一篇文章放在这里了.. 用 string来代替char * 数组,使用sort排序算法来排序,用unique 函数来去重1.De ...

  8. java中的修饰符和基本数据类型

    1.java中的修饰符 java中的修饰符主要是用来对类资源进行一个权限控制,上面表格表现的很清晰,无需多言. 2.java中的基本数据类型 java中的数据类型分为引用类型和基本类型.基本数据类型有 ...

  9. 使用MessageFormat替换字符中的占位符

    使用String.format可以实现字符串的格式化功能,即将后面参数中的值替换掉format中的%s,%d这些值.但MessageFormat更为强大,不用管传入值是字符串还是数字,使用占位符即可. ...

随机推荐

  1. 20155208徐子涵Vim编辑器学习经验

    20155208徐子涵 2016-2017-2 Vim编辑器学习经验 当我们运用虚拟机进行书写代码时,我们就会用到Vim编辑器,用Vim编辑器进行编辑特别方便,而Vim编辑器中也有一些操作需要去学习. ...

  2. Vs code 设置

    { "git.ignoreMissingGitWarning": true, "terminal.integrated.shell.windows": &quo ...

  3. hello1分析

    1:选择hello1文件夹并单击“打开项目”.展开“Web页”节点,然后双击该index.xhtml文件以在编辑器中查看它. 该index.xhtml文件是Facelets应用程序的默认登录页面.在典 ...

  4. python------Json与pickle数据序列化

    一.json序列化 xml在被json取代,不同平台之间的语言转换,只能处理简单的.复杂的用pickle: pickle只能在python中用,而在Java中json也可以被识别. info = { ...

  5. mysql对后空格不敏感 mysql数据库对空格的查询处理

    mysql对后空格不敏感 https://blog.csdn.net/lzupb/article/details/73530589 结论:查询条件中建议对字符串做trim处理,在数据入库的时候最好也做 ...

  6. servlet创建项目过程中,servlet内容重写的两种搭建,tomcat的配置,class的存放位置,web.xml的搭建等注意事项与易错点

    运行一个servlet项目:需要做这些前提工作: 1.配置tomcat,在server选项卡的设置也就基本的设置,HTTP port与JMX port等端口号:基本都是默认的.这里需要注意的是,有的教 ...

  7. ios-UITableView无内容时,不显示多余的分隔线

    效果如上. 只要补上以下方法: //设置多于的分割线 -(void)setExtraCellLineHidden: (UITableView *)tableView { UIView *view = ...

  8. C++中的抽象类

    一.抽象类学习笔记 1.virtual修饰函数(虚函数)后面加=0就称为一个纯虚函数,一个类中只要有纯虚函数那么它就是一个抽象类.抽象类不能用来实例化对象,是用来给他的派生类定义好这些框架的,给使用这 ...

  9. GCC related commands

    GCC   -l  option is to link the library. It can use for static and share link.  Link -l with library ...

  10. 初等数论及其应用 (第6版) (Kenneth H.Rosen 著)

    第1章 整数 1.1 数和序列 1.2 和与积 1.3 数学归纳法 1.4 斐波那契数 1.5 整除性 第2章 整数的表示法和运算 2.1 整数的表示法 2.2 整数的计算机运算 2.3 整数运算的复 ...