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

The*_*Man 6 java regex string template-engine substring

我希望我的 Java 应用程序从用户读取一个字符串,该字符串可能包含一些标签,例如:

String text = " value 1 = #value1 and value 2 = #value2 ";
int[] intArray = new int[] {4,5};
Run Code Online (Sandbox Code Playgroud)

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

String result = " value 1 = 4 and value 2 = 5 "
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Kep*_*pil 4

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

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());
Run Code Online (Sandbox Code Playgroud)

编辑
许多人指出StringBuilder更适合这项工作。我同意,但不幸的是MatcherAPI 不接受StringBuilder作为appendReplacement()appendTail()方法的参数。

  • @Rudi:添加了一条评论来解决这个问题。你不是第一个指出这一点的人。:) (3认同)