gpt4 book ai didi

java - 对此集合执行文本替换的最有效方法是什么?

转载 作者:行者123 更新时间:2023-11-29 08:15:59 25 4
gpt4 key购买 nike

假设您有一个 List<String>集合,其中可以包含数以万计的字符串。如果其中一些格式为:

"This is ${0}, he likes ${1},${2} ... ${n}"

什么是最有效的方式(性能方面)将上面的字符串转换为:

"This is %1, he likes %2,%3 ... %n"

请注意,% 方式从 1 开始。这是我的解决方案:

import java.util.regex.*;
...
String str = "I am ${0}. He is ${1}";
Pattern pat = Pattern.compile("\\\$\\{(\\d+)\\}");
Matcher mat = pat.matcher(str)
while(mat.find()) {
str = mat.replaceFirst("%"+(Integer.parseInt(mat.group(1))+1))
mat = pat.matcher(str);
}
System.out.println(str);

我希望它是有效的 Java 代码,我现在刚刚在 GroovyConsole 中编写了它。我对更有效的解决方案很感兴趣,因为我认为在如此多的字符串上应用如此多的正则表达式替换可能太慢了。最终代码将作为 Java 代码而不是 Groovy 代码运行,我只是使用 Groovy 进行快速原型(prototype)设计:)

最佳答案

这是我的做法:

import java.util.regex.*;

public class Test
{
static final Pattern PH_Pattern = Pattern.compile("\\$\\{(\\d++)\\}");

static String changePlaceholders(String orig)
{
Matcher m = PH_Pattern.matcher(orig);
if (m.find())
{
StringBuffer sb = new StringBuffer(orig.length());
do {
m.appendReplacement(sb, "");
sb.append("%").append(Integer.parseInt(m.group(1)) + 1);
} while (m.find());
m.appendTail(sb);
return sb.toString();
}
return orig;
}

public static void main (String[] args) throws Exception
{
String s = "I am ${0}. He is ${1}";
System.out.printf("before: %s%nafter: %s%n", s, changePlaceholders(s));
}
}

test it at ideone.com

appendReplacement() 执行两个主要功能:它附加上一个匹配项和当前匹配项之间的任何文本;它解析组引用的替换字符串,并将捕获的文本插入到它们的位置。我们不需要第二个函数,所以我们通过给它一个空的替换字符串来绕过它。然后我们用生成的替换文本自己调用 StringBuffer 的 append() 方法。

在 Java 7 中,这个 API 将被更多地开放,使得进一步的优化成为可能。 appendReplacement() 功能将分解为单独的方法,我们将能够使用 StringBuilder 而不是 StringBuffers(在 JDK 1.4 中引入 Pattern/Matcher 时,StringBuilder 还不存在)。

但可能最有效的优化是编译模式一次并将其保存在 static final 变量中。

关于java - 对此集合执行文本替换的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4878582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com