概述

占位符替换, 占位符表示为:{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. skearn/pandas

    转: http://www.cnblogs.com/jasonfreak/p/5448385.html 1 特征工程是什么?2 数据预处理 2.1 无量纲化 2.1.1 标准化 2.1.2 区间缩放法 ...

  2. SQL-数据库操作-002

    数据库的创建:create database data_name on primary ( name=data_1, filename='D\Data\data_name.mdf', size=50m ...

  3. Python的文件处理

    引子 1.问题:给你一个文件 "兼职白领学生空姐模特护士联系方式.txt" ,如何查看内容? 答: 安装文本编辑器软件 选中右键,利用文本编辑器软件打开 查看 or 写入 保存,关 ...

  4. 我的vim(持续更新)

    保存并退出:wq 退出但不保存修改:q! 不退出vi使用shell(bash)命令:!bash (如果想回到vi,bash下输入exit回车) 设置行号 :set nu 取消行号:set nonu 设 ...

  5. Eclipse无法编译,提示错误“找不到或者无法加载主类”解决方法

    jar包问题: 1.项目的Java Build Path中的Libraries中有个jar包的Source attachment指为了一个不可用的jar包, 解决办法是:将这个不可用的jar包remo ...

  6. 诡异的磁盘空间100%报警分析得出df -h与du -sh的根本性差别

    前言:早晨磁盘报警刚清空完tomcat和nginx日志,使用的命令是类似echo "" > show_web-error.log或者> show_web-debug.l ...

  7. 存储-实例-ibm v3700

    raid5总容量计算(n-1)*最小盘容量 RAID0:N块盘组成,逻辑容量为N块盘容量之和:RAID1:两块盘组成,逻辑容量为一块盘容量:RAID3:N+1块盘组成,逻辑容量为N块盘容量之和:RAI ...

  8. MCU ADC 进入 PD 模式后出现错误的值?

    MCU ADC 进入 PD 模式后出现错误的值? 在调试一款 MCU,最开始问题是无法读到 ADC 的值,应该是读到的值是异常高. 怀疑问题 可能是主频太低,为了降低功耗,这个 MCU 主频被我降了很 ...

  9. 使用.pth文件扩展python环境路径

    使用.pth文件扩展python环境路径 有时候我们不希望把一个库放到 site-packages 下面,而是更愿意把它保留在原始的工程目录中,方便管理和维护.那么怎么能让 Python 运行环境找到 ...

  10. C# 值传参和引用传参

    值传递:对于个人理解,值传递就像是python中的深拷贝,值传递的内容和原来的内容是两份不同的东西,相互不影响. 引用传递:对于个人理解,引用传递就是python中的复杂多维list的浅拷贝,它传递的 ...