概述
占位符替换, 占位符表示为:{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插件总结