概述

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

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

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

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

使用Map对占位符的内容进行替换;

使用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}};

*

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

*

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

*/

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 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}表示占位符

*

* 利用反射 自动获取对象属性值 (必须有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;

* 示例: "名字:{name},年龄:{age},学校:{school}", 则返回:Set[name,age,school]

*

* pattern示例:

*

 {@code

* // 尖括号: 表示为占位符

* Pattern pattern = Pattern.compile("\\");

*

* // 大括号:{placeHolder} 表示为占位符, 上面的示例中就使用{}作为占位符

* Pattern pattern = Pattern.compile("\\{(.*?)\\}");

* }

*

*

* @param sourceString

* @param pattern

* @return

*/

public static Set findPlaceHolderKeys(String sourceString, Pattern pattern) {

Set 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 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

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

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

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

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

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

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

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

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

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

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

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

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

string中常用的函数

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

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

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

Java替换字符串中的占位符

在开发中,会有动态配置字符串其中的某些字符,如何使用字符中的占位符,并且在代码动态替换占位符实现动态配置字符串! 1.定义字符串时,再string文件添加字符串: 注意!记得要在字符文件中加上这些: ...

随机推荐

hadoop-1.2.0 eclipse插件编译

linux.windows下通用,亲测. 下面以window为例,假设:hadoop工程目录位于D:\work\eclipse64\hadoop-1.2.0.1.3.0.0,eclipse安装目录为E ...

mysql 打包表在phpmyadmin提示正在使用中..

一,利用phpmyadmin修改表功能,REPAIR TABLE `你的表名` 或直接在数据库管理界面,选中表如下图 二,如果利用修改功能失败了我们还可以尝试在替换本地mysql数据库时,我们先停止m ...

WordPress 实用SEO插件总结

mysql替换占位符_【占位符替换】替换String中的占位符标志位{placeholder}相关推荐

  1. php 命令行打印换行符_如何在命令行输出中打印换行符

    php 命令行打印换行符 Surprisingly, getting computers to give humans readable output is no easy feat. With th ...

  2. word文档怎么给数字加千分符_如何给word文档中的数字添加千分位分隔符

    展开全部 准备工具/材料:windows10Build10158版本,Excel 2013版本. 1.此演示操作中使用的办公软件是Excel 2013版本. 2.windows10Build10158 ...

  3. mysql 事务回滚_简短截说阐述redis中事务的使用

    我们知道,在关系型数据库中,比如mysql,如果要使用事务,首先向数据库服务器发送 BEGIN ,然后执行各个相互一致的写操作和读操作,最后,用户可以选择发送 COMMIT 来确认之前所做的修改,或者 ...

  4. hive能加快MySQL查询速度吗_建立索引可以加快表中数据查询的速度吗

    首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合. 如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特 ...

  5. mysql句柄是文件描述符_误删除innodb ibdata数据文件 文件句柄 文件描述符 proc fd...

    误删除innodb ibdata数据文件  文件句柄  文件描述符  proc  fd http://www.cnblogs.com/gomysql/p/3702216.html 提示:如果不小心通过 ...

  6. 只能替换有源晶振 时钟发生器_有源晶振选型与替换原则

    普通有源晶振图片 有源晶振是将石英晶体谐振器和IC等相关功能电路集成封装在一起,完成特定功能的模块,主要应用于对时钟信号稳定度及精度有较高要求的数码电子产品领域,如蓝牙模组(BLUETOOTH).WI ...

  7. python换行的转义符_(三)python的转义字符,换行符和除法

    Python的转义字符: \ 在python中,我们知道,数据类型-字符串的写法有多种方式,我们可以是单引号.双引号.三引号都可以表示一个字符串,比如,下面的写法都是等价的 print('hello, ...

  8. java正则表达式 替换标签内容_使用Java正则表达式替换HTML标签

    一.实现目标 实现多个个HTML页的合并预览,需要如下处理 1)去掉meta标签 2)替换input标签,只保留value值(因为是预览,不保留输入框) 3)移除隐藏的input标签,即type=&q ...

  9. word2010删除分节符_在Word 2007和2010中更改分节符的类型

    word2010删除分节符 Have you ever tried to change the type of a section break in Word and only managed to ...

  10. python修饰符用法_c#教程之C#语言中的修饰符汇总

    https://www.xin3721.com/eschool/python.html 修饰符是用于限定类型以及类型成员的申明的一种符号. 下面主要从C#中的访问修饰符,作用于类和结构的修饰符,用在方 ...

最新文章

  1. macos big sur安装php扩展_用PHP构建基于swoole扩展的socket服务(附PHP扩展安装步骤)...
  2. 【MySQL经典案例分析】 Waiting for table metadata lock
  3. git gui管理服务器配置文件,从 Git Gui 管理的Repository(库) 提交更改到 Bonobo服务器管理的Repository(库)...
  4. sv队列和动态数组的区别_Go 刷 LeetCode 系列:经典(7) 设计双端队列
  5. vscode 编辑器快捷键
  6. 图片在xml文件中直接加载.9文件
  7. appium学习【三】:截图时,图片命令中包含当前的函数名,以区分错误是在哪个函数报的...
  8. Maxthon中RSS阅读器BUG解决[原创]
  9. 4符号代码_身为程序员我敢跟你打赌100块,这个数学符号你根本不会认不会写...
  10. qt qtableview 刷新列表_qt中Qtableview的用法
  11. 一位老人告诉我的人生哲理
  12. 鸟瞰Atlassian认证
  13. 《佛密诸事》第十一章:解读大悲咒
  14. Windows Docker Desktop 无法启动报错 Docker Desktop is shutting down 的可能解决办法
  15. Microsoft Teams网络慢,卡顿,怎么办?
  16. kubernetes—ConfigMap 与 Secret
  17. Elasticsearch索引安装使用
  18. 三维地图app的发展,离不开Infortrend GSe Pro 高效NAS共享
  19. Evernote新搭档Evertracker,掌控自己的时间(视频)
  20. java 公交管理系统 代码_java公交线路管理系统

热门文章

  1. 人工智能产生式系统动物识别实验python
  2. 关于固态硬盘开卡转接卡的研究,用SM2258XT测试智微、祥硕、威盛
  3. 朴素贝叶斯+拉普拉斯平滑代码实现-方法二
  4. matlab编程绘制直方图,matlab绘制直方图程序
  5. MagicDraw建模显示中文问题
  6. 组建局域网_局域网组建常用的网线种类解读
  7. 网络工程师--网络规划和设计案例分析(5)
  8. Report Machine 的问题 补充!!!
  9. 车辆动力学知识总结(五)运动学模型的线性化和离散化
  10. PyQt5--google快捷翻译