我希望Java应用程序从用户读取字符串,字符串可能包含一些标记,例如:
String text = " value 1 = #value1 and value 2 = #value2 ";
int[] intArray = new int[] {4,5};
用户也将输入一个数组的值到应用程序。作为一个程序员,我不知道确切的数目的值在字符串。我想编程生成这个字符串:
String result = " value 1 = 4 and value 2 = 5 "
为此,我实现了一个方法,搜索#value*
正则表达式,并将其替换为值堆栈中的第一个元素。它循环直到程序无法在主字符串中找到任何#值,问题是对于大文本,程序需要太多时间来执行,考虑到所采用的方法,这是正常的。
我还听说过一些使用Velocity和FreeMarker的模板技术,但我从未使用过它们(非常欢迎对此进行任何澄清)。
所以我的问题是:解决此问题的最佳方法是什么(执行时间最短)?
- PS:我不需要代码,我只需要一个方法或API,可以解决这个问题。*
4条答案
按热度按时间quhf5bfb1#
如果你在每次替换的时候都创建一个新的完整的
String
,你会遇到一些问题。你可以尝试使用Matcher
中的helper方法来构建一个StringBuffer
。对于大的输入,这会更快:许多人指出
StringBuilder
更适合这项工作,我同意,但不幸的是Matcher
API不接受StringBuilder
作为appendReplacement()
和appendTail()
方法的参数。oiopk7p52#
有大量的模板/表达式语言引擎可以帮助您解决这个问题,
Velocity
和Freemaker
也可以解决这个问题,但是对于这个相当简单的任务来说,它们可能太重了。正如@Keppil(+1)提到的,最简单的方法是使用regexp,正确的代码需要O(n)时间。
仅供参考,对于更复杂的情况,你可以检查Apache Jexl library。是相当轻,有明确和简单的API。你的情况可以解决以下代码:
jtoj6r0c3#
使用静态的
String.format(String format, Object... args)
方法来格式化带有特定参数的字符串。要了解有关如何正确创建有效模板字符串的详细信息,请参阅此文档:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html#detail
tnkciper4#
Java可能会有字符串模板(可能来自版本21)。
参见the string templates proposal (JEP 430) here。
它将是这样的:
P.S. Kotlin可以100%与Java互操作,它支持更干净的字符串模板:
与extension functions结合使用,可以实现与Java模板处理器(例如
STR
)相同的功能。