Java字符串格式化,{}占位符根据名字替换实例

 更新时间:2020年10月23日 15:11:38   作者:leaves_story  
这篇文章主要介绍了Java字符串格式化,{}占位符根据名字替换实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

我就废话不多说了,大家还是直接看代码吧~

import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringFormatUtil {

  private static final Pattern pattern = Pattern.compile("\\{(.*?)\\}");
  private static Matcher matcher;

  /**
   * 格式化字符串 字符串中使用{key}表示占位符
   *
   * @param sourStr
   *      需要匹配的字符串
   * @param param
   *      参数集
   * @return
   */
  public static String stringFormat(String sourStr, Map<String, Object> param) {
    String tagerStr = sourStr;
    if (param == null)
      return tagerStr;
    try {
      matcher = pattern.matcher(tagerStr);
      while (matcher.find()) {
        String key = matcher.group();
        String keyclone = key.substring(1, key.length() - 1).trim();
        Object value = param.get(keyclone);
        if (value != null)
          tagerStr = tagerStr.replace(key, value.toString());
      }
    }catch (Exception e){
      return null;
    }
    return tagerStr;
  }

  /**
   * 格式化字符串 字符串中使用{key}表示占位符 利用反射 自动获取对象属性值 (必须有get方法)
   *
   * @param sourStr 需要匹配的字符串
   *
   * @return
   */
  public static String stringFormat(String sourStr, Object obj) {
    String tagerStr = sourStr;
    matcher = pattern.matcher(tagerStr);
    if (obj == null)
      return tagerStr;

    PropertyDescriptor pd;
    Method getMethod;
    // 匹配{}中间的内容 包括括号
    while (matcher.find()) {
      String key = matcher.group();
      String keyclone = key.substring(1, key.length() - 1).trim();
      try {
        pd = new PropertyDescriptor(keyclone, obj.getClass());
        getMethod = pd.getReadMethod();// 获得get方法
        Object value = getMethod.invoke(obj);
        if (value != null)
          tagerStr = tagerStr.replace(key, value.toString());
      } catch (Exception e) {
        // TODO Auto-generated catch block
        // Loggers.addException(e);
      }
    }
    return tagerStr;
  }

  /**
   * 格式化字符串 (替换所有) 字符串中使用{key}表示占位符
   *
   * @param sourStr
   *      需要匹配的字符串
   * @param param
   *      参数集
   * @return
   */
  public static String stringFormatAll(String sourStr, Map<String, Object> param) {
    String tagerStr = sourStr;
    if (param == null)
      return tagerStr;
    try {
      matcher = pattern.matcher(tagerStr);
      while (matcher.find()) {
        String key = matcher.group();
        String keyclone = key.substring(1, key.length() - 1).trim();
        Object value = param.get(keyclone);
        if (value != null)
          tagerStr = tagerStr.replace(key, value.toString());
      }
    }catch (Exception e){
      return null;
    }
    return tagerStr;
  }

  /**
   * 格式花字符串,按照占位符名字
   * 输入:sourStr = xxxxx{a}xxxx{b} ,param = {a:A,b:B}
   * 输出:targetStr = xxxxAxxxxB
   * @param sourStr
   * @param param
   * @return
   */
  public static String stringFormat(String sourStr, JSONObject param) {
    String tagerStr = sourStr;
    if (param == null)
      return tagerStr;
    try {
      matcher = pattern.matcher(tagerStr);
      while (matcher.find()) {
        String key = matcher.group();
        String keyclone = key.substring(1, key.length() - 1).trim();
        Object value = param.get(keyclone);
        if (value != null)
          tagerStr = tagerStr.replace(key, value.toString());
      }
    }catch (Exception e){
      return null;
    }
    return tagerStr;
  }

  public static void main(String[] args) {
//    Map<String,Object> map = new HashMap<>();
//    map.put("id","111");
//    map.put("sss","ss");
//    JSONObject json = new JSONObject();
//    json.put("id","212");
//    json.put("fff","xxxx");
//    json.put("emmmmm",11);
//    stringFormat("sisas&{fff}_diwahwi%{id}{jio}",json);
  }
}

补充知识:java中占位符的使用

二话不说,先上代码

package com.string.format;

public class StringFormat {
  //占位符%s,拼接sql,删除两个表中的数据,条件是字符串数组类型的id
  public static void formSql(String tableName,String tableName2,String...strings){
    //sql占位符 %s占位符
    String sql="delete from %s,%s where id in (%s)";
    //声明新的字符串
    String sqls="";
    //遍历字符串的参数数组
    for (String str : strings) {
      //将参数数组拼接成字符串,用逗号分割
      sqls += str + ",";
    }
    //拼接最后会多出个逗号,截取
    sqls=sqls.substring(0, sqls.length()-1);
    //format第一个sql参数为目标字符串,tableName,tableName2,为替换的两表的名字,sqls为删除数据的参数集合
    String s=String.format(sql, tableName,tableName2,sqls);
    //输出拼接后的sql
    System.out.println(s);
  }
  public static void main(String[] args) {
    //传入参数为指定表名,和参数值
    StringFormat.formSql("user","role", "1","3","5","7","9","33");
  }
}

其实,传入的参数是数组类型的 值,我们也可以按array[0],array[1]的方式插入参数,只是参数个数应用不灵活,还是使用数组的方式取值比较好,

public static void format(){
    String st="%s的%s的价格是%f,是否售罄%c,占总销售的%d%%,库存%d,是否为畅销品%b";
    String s=String.format(st, "58优品","啤酒",3.5,'是',50,199,true);
    System.out.println(s);
  }
  public static void main(String[] args) {
    //传入参数为指定表名,和参数值
    //StringFormat.formSql("user","role", "1","3","5","7","9","33");
    format();
  }

public static void format(){
    //String st="%s的%s的价格是%f,是否售罄%c,占总销售的%d%%,库存%d,是否为畅销品%b";
    //String s=String.format(st, "58优品","啤酒",3.5,'是',50,199,true);
    //System.out.println(s);
    SimpleDateFormat simple=new SimpleDateFormat("yyyy年MM月dd日 HH点mm分ss秒");
    String newDate=simple.format(new Date());
    String st1="%s的%s的价格是%s,是否售罄%s,占总销售的%s%%,库存%s,是否为畅销品%s,当前日期为%s";
    String ss=String.format(st1, "58优品","啤酒","3.5",'是',"80","998","true",newDate);
    
    System.out.println(ss);
  }
  public static void main(String[] args) {
    //传入参数为指定表名,和参数值
    //StringFormat.formSql("user","role", "1","3","5","7","9","33");
    format();
  }

/*%S字符串类型的占位符
   * %c字符类型的占位符
   * %b布尔类型的占位符
   * %d整数类型的占位符
   * %%百分比类型的占位符
   * %n换行类型的占位符
   * %t时间类型的占位符
   * c全部的日期时间类型
   * F年-月-日格式
   * D年/月/日格式
   * rHH:MM:SS格式12小时制
   *
   */

以上这篇Java字符串格式化,{}占位符根据名字替换实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java InheritableThreadLocal用法详细介绍

    Java InheritableThreadLocal用法详细介绍

    InheritableThreadLocal继承了ThreadLocal,此类扩展了ThreadLocal以提供从父线程到子线程的值的继承:当创建子线程时,子线程接收父线程具有的所有可继承线程局部变量的初始值。 通常子线程的值与父线程的值是一致的
    2022-09-09
  • 解决mybatis-plus新增数据自增ID变无序问题

    解决mybatis-plus新增数据自增ID变无序问题

    这篇文章主要介绍了解决mybatis-plus新增数据自增ID变无序问题,具有很好的参考价值,希望对大家有所帮助。
    2023-07-07
  • Spring MVC整合FreeMarker的示例

    Spring MVC整合FreeMarker的示例

    这篇文章主要介绍了Spring MVC整合FreeMarker的示例,帮助大家更好的理解和使用Spring MVC,感兴趣的朋友可以了解下
    2020-12-12
  • Java语言中&&与& ||与|的区别是什么

    Java语言中&&与& ||与|的区别是什么

    这篇文章主要介绍了Java语言中&&与& ||与|的区别是什么的相关资料,需要的朋友可以参考下
    2017-04-04
  • springboot自定义starter启动器的具体使用实践

    springboot自定义starter启动器的具体使用实践

    本文主要介绍了springboot自定义starter启动器的具体使用实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 介绍Jersey-Jersey入门基础

    介绍Jersey-Jersey入门基础

    REST不是一种新的技术,而仅仅是一个理论,实践这样的理论可以让我们的应用更加先进。
    2013-02-02
  • 详解SpringMVC和MyBatis框架开发环境搭建和简单实用

    详解SpringMVC和MyBatis框架开发环境搭建和简单实用

    这篇文章主要介绍了详解SpringMVC和MyBatis框架开发环境搭建和简单实用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • java使用POI批量导入excel数据的方法

    java使用POI批量导入excel数据的方法

    这篇文章主要为大家详细介绍了java使用POI批量导入excel数据的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • SpringBoot+Netty+WebSocket实现消息发送的示例代码

    SpringBoot+Netty+WebSocket实现消息发送的示例代码

    这篇文章主要介绍了SpringBoot+Netty+WebSocket实现消息发送的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java实现文件上传下载

    java实现文件上传下载

    这篇文章主要为大家详细介绍了java实现文件上传下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08

最新评论