概述
java的String 类提供了format方法对字符串进行格式化,但在实际使用中经常发现这个方法不够灵活。所以在Lexer实现了一个。 其模板为一个字符串,并对其中的 { 变量表达式 }内部的内容进行替换,其中用“\”作为转义符;变量表达式类似于jsp中的el表达式。这个功能比较单一,直接用使用示例来展示。
使用示例
Map<String,Object> map = new HashMap<>(5);
Map<String,Object> usreInfo = new HashMap<>(5);
usreInfo.put("userCode","admin");
usreInfo.put("userName","管理员");
map.put("userInfo",usreInfo);
String str = Pretreatment.mapTemplateString(
"转义符\\\\又一个转义符\\{ {无法找到的变量} \"引号中的\\和{都不会被处理}\" "+
"你的姓名是{userInfo.userName}", map, "[没有赋值]");
System.out.println(str );
数据结果
转义符\又一个转义符{ [没有赋值] "引号中的\\和{都不会被处理}" 你的姓名是管理员
需要说明的是:
- 因为java的字符串也是用"\“作为转义符,所以在模板中要想输出”\“需要写成”\\\\"。
- 模板中用单引号和双引号引起来的字符串都不错分析,可以写任意字符串。
- Pretreatment.mapTemplateString 方法的第二个变量不是只能用map可以用任意类型的变量。
源码
完整的源码请点击查看,下面式核心代码片段:
/** mapTemplateString
* 变量 形式如 {变量名} 注意这个和上面的不一,变量必须放在{}中
*
* @param template 模板,比如: 你的姓名是{usreCode} , 传入有userCode建的map或者有userCode属性的对象
* @param object 传入的对象,可以是一个Map 、JSON 或者Pojo
* @param nullValue 找不到变量时的值
* @return 新的表达式
*/
public static String mapTemplateString(String template,Object object, String nullValue){
if(StringUtils.isBlank(template)){
return nullValue;
}
Lexer varTemplate = new Lexer();
varTemplate.setFormula(template);
StringBuilder mapString = new StringBuilder();
int nlen = template.length();
int bp = 0;
while(true) {
String aword = varTemplate.getAWord();
while(true){
// 检查转义符
if("\\".equals(aword)){
int ep = varTemplate.getCurrPos();
mapString.append(template.substring(bp, ep - 1));
//获取 \\ 后面的一个字符
mapString.append(template.charAt(ep));
varTemplate.setPosition(ep+1);
bp = varTemplate.getCurrPos();
//aword = varTemplate.getAWord();
}else if("{".equals(aword) || aword==null || "".equals(aword)){
break;
}
aword = varTemplate.getAWord();
}
if(!"{".equals(aword))
break;
int ep = varTemplate.getCurrPos();
if(ep-1>bp){
mapString.append(template.substring(bp, ep - 1));
}
varTemplate.seekToRightBrace();
bp = varTemplate.getCurrPos();
if(bp-1>ep) {
String valueName = template.substring(ep, bp - 1);
mapString.append(GeneralAlgorithm.nvl(
StringBaseOpt.objectToString(
ReflectionOpt.attainExpressionValue(object,valueName)),nullValue));
}
}
if(bp<nlen)
mapString.append(template.substring(bp));
return mapString.toString();
}