通过字符串模板生成字符串[附源码]

概述

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 );

数据结果

转义符\又一个转义符{ [没有赋值] "引号中的\\和{都不会被处理}" 你的姓名是管理员

需要说明的是:

  1. 因为java的字符串也是用"\“作为转义符,所以在模板中要想输出”\“需要写成”\\\\"。
  2. 模板中用单引号和双引号引起来的字符串都不错分析,可以写任意字符串。
  3. 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();
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值