多语言编程过程中,字符串模板替换是一个非常常用的功能,其实现方式也各有千秋,下面介绍几种比较常用的模板替换方式
- 一、String.format
此方法是jdk中String类中的一个静态方法,通过占位符方式实现字符串内容替换方案,其中占位符包括如下
%s : 表示字符串类型的占位符。
%d : 表示整型数值(十进制)的占位符。
%x : 表示十六进制数值的占位符。
%f : 表示浮点数的占位符。
%e : 表示科学记数法表示的浮点数。
%c : 表示单个字符。
%t : 时间/日期相关的格式,后面可以接具体的格式化代码如%tY表示四位数的年份,%tm表示月份等。
%% : 表示输出一个百分号(%)自身。
使用方式为
String.format("i am a %s,i am %s years old","man",12)
该种方式使用方便,通过正则替换方式实现。简单的替换容易实现,可用于布局调整,对齐,数字、文本、日期等格式替换,但在使用过程中要注意,占位符必须与替换内容格式相对应,否则会抛出IllegalFormatConversionException异常。
- 二、MessageFormat.format()
MessageFormat处理多语言环境字符串功能非常强,其通过占位符参数索引方式实现字符串内容替换,在模板字符串中,使用 {index} 形式的占位符来标记要替换的部分,其中 index 是参数的位置。例如,"{0}" 表示第一个参数,"{1}" 表示第二个参数,以此类推。这些占位符可以与特定语言的文本混合,以适应不同语言的语序和语法习惯。同时,还支持本地化、格式化输出、复数等。
使用方式如下
MessageFormat.format("i am a {0},i am {1} years old,now time is {2,date}.","man",18,new Date())
//替换结果:i am a man,i am 18 years old,now time is 2024年5月9日.
MessageFormat.format("i have {0,choice,1#one mobile phone|1<mobile mobile phones}",1)
//替换结果:i have one mobile phones
MessageFormat.format("i have {0,choice,1#one mobile phone|1<many mobile phones}",8)
//替换结果:i have many mobile phones
注意事项
如果被转义字符串中包含单引号',需要特别注意,单引号的存在会影响转义结果的正确性,如
MessageFormat.format("it's a {0}","apple")
//替换结果:it's a {0}
解决方案
一、单引号转义
MessageFormat.format("'it''s a '{0}'","apple") //替换结果:it's a apple
二、单引号替换
String pattern = "it's a {0}";
pattern = pattern.replaceAll("'","&&&");
String returnVal = MessageFormat.format(pattern,"apple");
returnVal = returnVal.replaceAll("&&&","'");
//替换结果:it's a apple
- 三、其他方式
处理比较复杂的模板处理,可以使用模板引擎如FreeMarker等
Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg.setDirectoryForTemplateLoading(new File("D:\\templates")); Template template = cfg.getTemplate("test.ftl"); Map<String, String> data = new HashMap<>(); data.put("name", "pike"); Writer out = new OutputStreamWriter(System.out); template.process(data, out);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?