首页 > 其他分享 >字符串占位符替换——StringSubstitutor

字符串占位符替换——StringSubstitutor

时间:2024-04-12 16:47:52浏览次数:20  
标签:String commons dataMap StringSubstitutor 字符串 占位 替换

1 背景

众所周知Java中的字符串占位符替换非常不友好,无论是String#format还是MessageFormat#format都只能说能用,但说不上好用,关于以上两种字符串格式化的用法请参考:Java String formatMessageFormat format,本文推荐org.apache.commons.text.StringSubstitutor,StrSubstitutor是一个工具类,它的目的也是字符替换,它封装复杂的替换方法,并且可以实现递归替换、提供默认值、自定义占位符等。

2 使用

首先导入依赖maven坐标如下:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-text</artifactId>
    <version>1.11.0</version>
</dependency>

StrSubstitutor的封装了很多实用强大的功能,本文只介绍简单的使用。

2.1 使用系统属性

StringSubstitutor.replaceSystemProperties("You are running with java.version = ${java.version} and os.name = ${os.name}.");

2.2 使用map

下面用我司实际项目代码展示:

public CommonResponse<NotificationInstance> render(CommonRequest<NotificationInstanceDto> request) {
         try {
         // 获取请求参数
             NotificationInstanceDto requestParams = request.getRequestParams();
             // 获取模板字符串(含有占位符)
             String contentTemplate = requestParams.getContentTemplate();
             // 具体的业务数据,需要替换占位符
             Map<String, String> dataMap = requestParams.getBizData();
             // 创建StringSubstitutor,入参是要替换的业务数据map
             StringSubstitutor sub = new StringSubstitutor(dataMap);
             // 占位符字段替换为具体业务数据,入参为模板字符串
             String resolvedString = sub.replace(contentTemplate);
             NotificationInstance instance = new NotificationInstance();
             BeanUtils.copyProperties(requestParams, instance);
             instance.setNotificationContent(resolvedString);
             return this.success(instance);
         } catch (Exception e) {
             LogUtil.error(e);
             BizError error = new TemplateRenderError(null);
             error.setErrorMessage(e.getMessage());
             return this.fail(error);
         }
    }

注意,替换占位符的map中key要与占位符名相同,例如:

<html>${accountName},您好<br>
【${tenantName}】 系统管理员为您开通了账号,登录信息为:<br>
登录帐号为:${accountNo}<br>
初始密码为:${password}<br>
为了保障您的账号安全,请使用该密码登录xxx系统后及时修改密码,谢谢。</html>

此时dataMap中代码应类似为:

dataMap.put("tenantName", "xxx");
dataMap.put("accountNo", "admin");
dataMap.put("password", "skull1Qx");

最终结果为:

image-20240411114713996

2.3 自定义占位符

查看源码可以发现默认占位符为${},进一步查看构造方法可以发现:

public <V> StringSubstitutor(Map<String, V> valueMap, String prefix, String suffix, char escape) {
     this(StringLookupFactory.INSTANCE.mapStringLookup(valueMap), prefix, suffix, escape);
}

image-20240411113105933

其中入参prefix代表前缀,suffix代表后缀,escape表示要排除的字符,所以比如想要以%{}作为占位符可以这么创建:

StrSubstitutor sub = new StrSubstitutor(valuesMap, "%{", "}", '%');

更多详细使用请参考官方文档:

https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/commons/text/StringSubstitutor.html


本博客内容仅供个人学习使用,禁止用于商业用途。转载需注明出处并链接至原文。

标签:String,commons,dataMap,StringSubstitutor,字符串,占位,替换
From: https://www.cnblogs.com/zhaobo1997/p/18131617

相关文章

  • 二维字符串数组的传参时与指针互转时的问题
    二维数组如何传参二维字符串数组,转char**会导致的问题,以及编译报错要想得到正确的结果,需要按如下方式去写传参:#include<stdio.h>#include<string.h>//intchar_arr_copy(char**dest)//这样定义传参类型将导致编译报错,在低版本的编译器下或者没有报错但是得不到正确......
  • JSON.parse() 方法中里面有函数,转化完成后是字符串问题
    要将JSON字符串中的函数还原回原来的函数对象,你可以使用JSON.parse()方法,并提供一个reviver函数来将字符串表示的函数重新转换为函数对象。以下是你可以使用的代码示例:varobj={"name":"Runoob","alexa":function(){return10000;},"site":"www.runoob.com"};//......
  • String类型转LPCTSTR -----理解C++中的字符串类型转换
    在看代码时,发现有时候会把string类型转换为LPCTSTR,刚开始不理解为什么要做这个转换,所以做了一些调查,现在记录如下是这样的,STRING是代表C++中的字符串string,而LPCTSTR代表的是Windows系统中的字符串类型。也就是说,这样转换的目的是为了把C++中的字符串string转换为Windows系......
  • C#长sql语句换行(长字符串换行且换行符不计入字符串中)
    示例:在红圈处敲回车vs会将其分段并拼接,这不是我想要的效果、不仅不美观还不好复制sql语句只需要在字符串前加一个@号就可以解决......
  • StringHelper--字符串左右添加指定字符
    StringHelper--字符串左右添加指定字符1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Configuration;4usingSystem.Linq;5usingSystem.Text;6usingSystem.Threading.Tasks;78namespaceHRMessageApp.Helper9{10publiccla......
  • java中字符串替换的4种方法 replaceAll() 带正则表达式参数 str.replaceAll("[0-9]+
    java中字符串替换的4种方法replaceAll()带正则表达式参数str.replaceAll("[0-9]+","");目录前言一、String的replace()方法二、String的replaceAll()方法三、StringBuffer/StringBuilder的replace()方法四、Matcher的replaceAll()方法总结前言在日常开发中,我们对......
  • 算法训练营Day08-LeetCode344. 反转字符串 && 541. 反转字符串 II && 151. 反转字符串
    344.反转字符串题目链接:LeetCode344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题思路:字符串首尾字符交换即可完成反转。定......
  • 输入流和字符串互转InputStream2String和String2InputStream
    输入流转字符串12345678910111213141516171819public static StringInputStream2String(InputStreamin){    InputStreamReaderreader= null;    try {        reader= new InputStreamReader(in, "UTF-8");   ......
  • java代码将16进制字符串转换为图片,jdbc入库blob字段,解决ORA-01704,PLS-00172,ORA-06550,
    从Oracle导出SQL文件中的insert语句包含blob字段,语句HEXTORAW函数将16进制的字符串入库,由于字符串太长,insert失败下面的代码读取完整的insert语句,将HEXTORAW函数连同16进制的字符串替换为NULL,先将字段置空插入记录,然后使用PreparedStatement对图片文件读流更新入库importorg.......
  • Java中将字符串转换成数字的方法
    转换为整数(int)你可以使用Integer.parseInt()方法或Integer.valueOf()方法将字符串转换为int类型。javaStringstr="123";intnumber=Integer.parseInt(str);//使用parseInt//或者intnumberValue=Integer.valueOf(str);//使用valueOfSystem.out.println(number);//......