编程语言
首页 > 编程语言> > 如何从Java中的字符串模板生成字符串?

如何从Java中的字符串模板生成字符串?

作者:互联网

我希望我的Java App从用户读取String,String可能包含一些标签,例如:

String text = " value 1 = #value1 and value 2 = #value2 ";
int[] intArray = new int[] {4,5};

用户还将向应用程序输入值数组.作为程序员,我不知道String中值的确切数量.我想以编程方式生成此字符串:

String result = " value 1 = 4 and value 2 = 5 "

为此我实现了一个方法,搜索#valit * regex并将其替换为值堆栈中的第一个元素.循环直到程序在主字符串中找不到任何#value,问题是对于大文本,程序花费太多时间来执行,这是正常的,考虑到采用的方法.

我也听说过一些使用Velocity和FreeMarker的模板技术,但我从未使用它们(在这一点上任何澄清都是非常受欢迎的).

所以我的问题是:解决这个问题的最佳方法是什么(最短的执行时间)?

PS:我不需要代码,我只想要一种可以解决这个问题的方法或API.

解决方法:

如果您在每次替换时创建一个新的完整String,您确实会遇到问题.您可以尝试使用Matcher中的辅助方法来构建StringBuffer.对于大型输入,这应该快得多:

String text = " value 1 = #value1 and value 2 = #value2 ";
int[] intArray = new int[] { 4, 5 };
Pattern p = Pattern.compile("#value(\\d+)");
Matcher m = p.matcher(text);
StringBuffer result = new StringBuffer();
while (m.find()) {
    m.appendReplacement(result, String.valueOf(intArray[Integer.parseInt(m.group(1)) - 1]));
}
m.appendTail(result);
System.out.println(result.toString());

编辑
很多人都指出StringBuilder更适合这项工作.我同意,但不幸的是,Matcher API不接受StringBuilder作为appendReplacement()和appendTail()方法的参数.

标签:java,string,regex,template-engine,substring
来源: https://codeday.me/bug/20190830/1768784.html