java实现$进行匹配占位符并且替换数据工具类(代码片段)

张志翔̮ 张志翔̮     2022-10-22     561

关键词:

        PropertyUtils: 工具类使用了 commons-beanutils-1.8.2.jar 工具包进行获取数据源中数据

public class PlaceholderUtils 

    /** PLACEHOLDER_PATTERN */
    public static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("\\\\$\\\\(.*?)\\\\");

    /**
     * 替换string中占位符
     *
     * @param model 具有占位符的字符串,可以是json格式
     * @param data  数据源
     * @return the string
     * @throws InvocationTargetException invocation target exception
     * @throws IllegalAccessException    illegal access exception
     * @throws NoSuchMethodException     no such method exception
     * @since 1.4.0
     */
    public static String process(String model, String data) throws InvocationTargetException,
                                                                   IllegalAccessException,
                                                                   NoSuchMethodException 
        // 匹配器
        Matcher matcher = PLACEHOLDER_PATTERN.matcher(model);
        //判断如果 匹配到了占位符并且 数据源为空时抛出异常
        boolean findReplace = matcher.find();
        if (!findReplace) 
            return model;
        
        //判断数据是否为空(自己封装的工具类,可以修改为自己业务代码中的异常判断)
        Assertions.notBlank(data, String.format("匹配到占位符,但数据源为空,不能进行数据转换:%s", model));
        // 处理匹配到的值
        return doProcess(matcher, JsonUtils.parse(data, Map.class));
    

    /**
     * 替换string中占位符
     *
     * @param model 具有占位符的字符串,可以是json格式
     * @param data  数据源
     * @return the string
     * @throws InvocationTargetException invocation target exception
     * @throws IllegalAccessException    illegal access exception
     * @throws NoSuchMethodException     no such method exception
     * @since 1.4.0
     */
    public static String process(String model, Map<String, Object> data) throws InvocationTargetException,
                                                                                IllegalAccessException,
                                                                                NoSuchMethodException 
        // 匹配器
        Matcher matcher = PLACEHOLDER_PATTERN.matcher(model);
        boolean findReplace = matcher.find();
        if (!findReplace) 
            return model;
        
       //判断数据是否为空(自己封装的工具类,可以修改为自己业务代码中的异常判断)
        Assertions.notBlank(data, String.format("匹配到占位符,但数据源为空,不能进行数据转换:%s", model));
        // 处理匹配到的值
        return doProcess(matcher, data);
    

    /**
     * Do process
     *
     * @param matcher matcher
     * @param data    data
     * @return the string
     * @throws IllegalAccessException    illegal access exception
     * @throws InvocationTargetException invocation target exception
     * @throws NoSuchMethodException     no such method exception
     * @since 1.4.0
     */
    @NotNull
    private static String doProcess(Matcher matcher, Object data) throws IllegalAccessException,
                                                                         InvocationTargetException,
                                                                         NoSuchMethodException 
        StringBuffer values = new StringBuffer();
        matcher.reset();
        while (matcher.find()) 
            String key = matcher.group(1);
            Object value = PropertyUtils.getProperty(data, key);
            Assertions.notNull(value, String.format("占位符未匹配到数据:%s", key));
            matcher.appendReplacement(values, JsonUtils.toJson(value));
        
        matcher.appendTail(values);
        return values.toString();
    
  

/**
     * 处理json转换时多余的双引号
     *
     * @param str str
     * @return string string
     * @since 1.4.0
     */
    public static String doProcessQuotes(String str) 
    //使用正则表达式匹配对应的数据
        Matcher matcher = PROCESS_QUOTES.matcher(str);
        StringBuffer values = new StringBuffer();
        while (matcher.find()) 
            String s = matcher.group().replace("\\\\", "");
            //截取出的格式为 :""color":"red1","temperature":217111,"guanji":2",需要将前后的双引号去掉
            StringBuilder strobe = new StringBuilder();
            for (int i = 0; i < s.length(); i++) 
                if (i == 1 || i == s.length() - 1) 
                    continue;
                
                strobe.append(s.charAt(i));
            
            matcher.appendReplacement(values, doProcessQuotes(strobe.toString()));
        
        //将后续的数据追加进去
        matcher.appendTail(values);
        return values.toString();
    

用动态数据替换占位符

...2319:25:00【问题描述】:是否有使用XSL或java.text.MessageFormat实现以下目标的通用方法?【问题讨论】:【参考方案1】:如果您输入的XML如下:<OrderOrderNo="T122345"><CustomerFirstName="John"LastName 查看详情

java实现json参数占位符名称替换指定的多个变量值(代码片段)

前言Java实现占位符名称替换值占位符现在应该说是比较流行的动态赋值,本文主要介绍了Java占位符名称替换值,根据一串带着参数名占位符的url,替换掉对应参数名的值问题1如果有这样一个字符串Stringinfo="我... 查看详情

java中有啥方法可以读取占位符的字符串,并且把占位符替换成参数

...现在是从资源文件中读取一个字符串,这个字符串里面有占位符,读取结果如:xxxx0xxx1。现在要用一个方法把参数带入0和1中,java中好像有内置的方法,请问是什么,如果没有,求帮忙来个封装的类。谢谢直接调用MessageFormat.form... 查看详情

[java]_[初级]_[使用正则高效替换字符串的多个占位符为多个值](代码片段)

...的字符串。在Java的标准库里,使用Regex正则可以简单实现上边的方案。就是通过Matcher的appendReplacement[1]方法添加不匹配的字符串和替代字 查看详情

java中属性中的动态占位符替换

】java中属性中的动态占位符替换【英文标题】:DynamicPlaceholdersubstitutioninpropertiesinjava【发布时间】:2011-01-1310:05:06【问题描述】:我想在java应用程序的属性中动态替换占位符。喜欢WelcomeMessage=WelcomeMr.firstNamelastName!!!这些firstName... 查看详情

替换 tensorflow v2 的占位符

...】:对于我的项目,我需要将有向图转换为图的tensorflow实现,就好像它是一个神经网络一样。在tensorflow版本1中,我可以将所有输入定义为占位符,然后使用图的广度优先搜索为输出生成数据流图。然后我会使用feed_dict输入我的... 查看详情

Tensorflow:用 tf.Variable 替换/提供图形的占位符?

】Tensorflow:用tf.Variable替换/提供图形的占位符?【英文标题】:Tensorflow:Replacing/feedingaplaceholderofagraphwithtf.Variable?【发布时间】:2018-10-1423:59:24【问题描述】:我有一个模型M1,其数据输入是占位符M1.input,并且其权重经过训练。... 查看详情

用c#替换word文档中的占位符

】用c#替换word文档中的占位符【英文标题】:ReplacePlaceholdersinworddocumentwithc#【发布时间】:2010-09-1523:40:41【问题描述】:我有一个word(.docx)格式的模板,想用我自己的数据替换这个模板中的一些占位符,你知道我在哪里可以找到... 查看详情

如何使用正则表达式匹配从 xml 文件中搜索和替换包含占位符标记的文本。 VB.net 或 C#

】如何使用正则表达式匹配从xml文件中搜索和替换包含占位符标记的文本。VB.net或C#【英文标题】:HowdoIsearchandreplacetextcontainingplaceholdertokenswithavaluesfromanxmlfileusingregularexpressionmatching.VB.netorC#【发布时间】:2018-05-1701:00:55【问题描... 查看详情

试图用实际数据替换占位符文本,但它不起作用

】试图用实际数据替换占位符文本,但它不起作用【英文标题】:Tryingtoreplaceplaceholdertextwithactualdata,butitisnotworking【发布时间】:2020-06-1314:48:40【问题描述】:我正在用JS构建一个简单的预算应用程序。现在,我可以成功输入费... 查看详情

替换 java 属性中占位符中的属性值 - IntelliJ 2017.2

】替换java属性中占位符中的属性值-IntelliJ2017.2【英文标题】:Replacethepropertyvalueintheplaceholderinajavaattribute-IntelliJ2017.2【发布时间】:2017-12-1714:50:49【问题描述】:我注意到IntelliJ替换了占位符中的属性值。当鼠标悬停在显示属性... 查看详情

java模板变量替换(字符串占位符替换)(代码片段)

常用场景Java短信模板变量替换。效果源码publicstaticvoidmain(String[]args)StringsmsTemplate="验证码:#[code],您正在登录管理后台,5分钟内输入有效。";Map<String,Object>params=newHashMap<>();params.put("co 查看详情

Ransack 搜索表单将搜索替换为“占位符”

】Ransack搜索表单将搜索替换为“占位符”【英文标题】:Ransacksearchformreplacessearchwith"Placeholder"【发布时间】:2021-02-1320:20:39【问题描述】:我的城市搜索表单不知何故有一个“默认城市”,即使我点击提交并且url中存在... 查看详情

写的javascript方法实现用字符串替换占位符0,1,2,3等

写的JavaScript方法实现用字符串替换占位符0,1,2,3等参考技术A//你也太小气了吧?一分都不给??呵呵^-^varstr='str_0:0str_1:1str_2:2';functionformatStr()varary=[];for(i=1;i<arguments.length;i++)ary.push(arguments[i]);returnarguments[0].replace(/\(&... 查看详情

替换字符串占位符(代码片段)

可以用spring提供的一个PropertyPlaceholderHelper类替换代码如下:protectedvoidprocessProperties(ConfigurableListableBeanFactorybeanFactoryToProcess,Propertiesprops)throwsBeansExceptionStringValueResolvervalueResolver=newPlaceholderResolvingStringValueResolver(props);BeanDefinitionVisit... 查看详情

模板和占位符算法

...串为值的有效对象我需要编写一个代码,用属性映射中的匹配值替换占位符(连同括号)。示 查看详情

java日志格式应该是占位符还是字符串拼接

...,占位符的方式性能好,因为如果不打日志的话,就不会进行字符串拼接,节省性能。最后抱着一探究竟的心态,我进行了一次日志输出方式的实验。工具IDEA+Gradle+JD 查看详情

了解mybatis框架(代码片段)

...DataSource获取数据库连接Connection3.编写要执行带“?”占位符的SQL语句4.通过Connection及SQL创建操作命令对象Statement5.替换占位符:指定要替换的数据库字段类型,占位符索引及要替换的值6.执行SQL语句7.处理结果集8.释放... 查看详情