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

字符串占位符替换

时间:2023-06-08 16:02:15浏览次数:34  
标签:String res equals 占位 token 字符串 BRACE 替换

想模版引擎一样,替换字符串中的 ${} 占位符。

那为什么不直接使用模版引擎呢?……

public class A{

  private static final String BRACE_LEFT = "{";
    private static final String BRACE_RIGHT = "}";
    private static final String $ = "$";

    /**
     * 替换字符,占位符限定 ${}
     *
     * @param tmp    代码模版
     * @param params 参数
     * @return PreparedSql
     */
    public static String processMap(@NotNull String tmp, Map<String, ?> params) {
        StringTokenizer tokenizer = new StringTokenizer(tmp, "${}", true);
        StringBuilder res = new StringBuilder(tmp.length());
        String token;
        boolean escaped = false;
        while (tokenizer.hasMoreTokens()) {
            token = tokenizer.nextToken();
            if (escaped) {
                if ($.equals(token) || BRACE_LEFT.equals(token)) {
                    //占位符中出现美元符或者花括号
                    throw new IllegalArgumentException("Contain invalid char: " + token);
                } else if (BRACE_RIGHT.equals(token)) {
                    //标志复位
                    escaped = false;
                } else {
                    //参数名占位符
                    res.append(Converter.toString(params.get(token)));
                }
            } else {
                if ($.equals(token)) {
                    token = tokenizer.nextToken();
                    if (BRACE_LEFT.equals(token)) {
                        //检索到 '${' 开始尝试获取参数名
                        escaped = true;
                    } else {
                        //'$'独立出现的场景
                        res.append($).append(token);
                    }
                } else {
                    //普通字符
                    res.append(token);
                }
            }
        }
        return res.toString();
    }
}

 

标签:String,res,equals,占位,token,字符串,BRACE,替换
From: https://www.cnblogs.com/chenss15060100790/p/17466751.html

相关文章

  • c#中十六进制字符串转单精度浮点数
    1varcountBytes=newbyte[]{66,12,25,217};2varcountHexStr=ToHexStrFromByte(countBytes.ToArray());3uintnum=uint.Parse(countHexStr,System.Globalization.NumberStyles.AllowHexSpecifier);4byte[]floatVals......
  • python 中统计指定字符串出现的次数
     001、>>>str1="abcdaaab"##测试字符串>>>str1.count("a")##统计a出现的次数4>>>str1.count("b")2>>>str1.count("c")1>>>str1.count("a",0,4)......
  • python 中字符串大小写的转换
     001、全部转换为大写、或者全部转换为小写>>>str1="abcDEFgh">>>str1.lower()###小写'abcdefgh'>>>str1.upper()##大写'ABCDEFGH'>>>str1'abcDEFgh'>>>str1.casefo......
  • 后端获取TOKEN返oss上传地址,前端如何将字符串传给这个地址
    您也可以使用Axios库来发送请求,以下是发送表单请求的示例代码:constaxios=require('axios');functionuploadStringToOSS(ossPostData,content){constformData=newFormData();Object.keys(ossPostData.fields).forEach(key=>{formData.append(key,os......
  • Python在循环中修改遍历的字符串
    举例展示Python在循环中修改遍历的字符串,将不会影响循环的遍历顺序和执行轮数astr="abcaef"bstr="bcef"foriinastr:ifinotinbstr:astr=astr.replace(i,'')print(i)如上示例代码中,当i='a'时,bstr中没有'a',输出'a'......
  • 浮点数转字符串
    浮点数转字符串usingUnityEngine;publicclassJuse:MonoBehaviour{floata=2;floatb=6666.6666f;voidStart(){Debug.Log(a.ToString("#00"));//输出:02Debug.Log(a.ToString("#00.00"));//输出:02.00......
  • 各种数据库连接字符串
    SqlServer “DataSource=127.0.0.1;InitialCatalog=dbname;UserId=sa;Password=****;”Oracle"DataSource=127.0.0.1/dbname;port=1521;UserId=orcl;Password=***'*;"DB2"Server=127.0.0.1:50000;Database=dbname;UID=DBADM;PWD=****;"M......
  • 【acwing】Trie字符串统计
    Trie树学习感受相比于之前学习的kmp匹配算法,Trie树的实现还是非常好理解的。(kmp算法太难了orz)从直观的模拟过程来看,trie树就像一颗树一样,从上(根节点)到下(叶节点)有序串联起来组成一个字符串。每一个额外标记结束的位置表示字符串的结束,通过计算标记数即可指导一共有多少该字符串......
  • 关于CloudFront-Distribution-SSL-证书过期的更新替换操作记录
    提前说明:载止今天,AWSCloudFront还是只支持IAM类型的证书今天笔者主要讲述当AWSCloudFrontDistribution的SSL证书过期后,如何进行更新1、假定已经知道某个CloudFrontDistribution使用的SSL证书将要过期2、进入CloudFrontDistributions页面,找到指定的Distribution,  ......
  • 【每日一题】LeetCode 859. 亲密字符串
    题目描述给你两个字符串s和goal,只要我们可以通过交换s中的两个字母得到与goal相等的结果,就返回true;否则返回false。交换字母的定义是:取两个下标i和j(下标从0开始)且满足i!=j,接着交换s[i]和s[j]处的字符。例如,在“abcd”中交换下标0和下标2的元素可以......