我希望替换 String 中的两个子字符串,所以我编写了以下代码。我认为当S是一个巨大的字符串时,我的代码效率太低了。
我可以一次替换一个字符串的多个子字符串吗?或者有更好的方法来替换字符串吗?
已添加:
希望能找到一种快速替换子串的方法!
String s="This %ToolBar% is a %Content%";
s=s.replace("%ToolBar%","Edit ToolBar");
s=s.replace("%Content%","made by Paul");
最佳答案
如果您只想执行一次 s
搜索,您可以执行自己的 indexOf()
循环,或使用正则表达式替换循环。
下面是使用正则表达式替换循环的示例,它使用 appendReplacement()
和 appendTail()
构建结果的方法。
为了消除进行字符串比较来确定找到哪个关键字的需要,每个关键字都被制作为一个捕获组,因此可以使用 start(int group)
快速检查关键字是否存在。 .
String s = "This %ToolBar% is a %Content%";
StringBuffer buf = new StringBuffer();
Matcher m = Pattern.compile("%(?:(ToolBar)|(Content))%").matcher(s);
while (m.find()) {
if (m.start(1) != -1)
m.appendReplacement(buf, "Edit ToolBar");
else if (m.start(2) != -1)
m.appendReplacement(buf, "made by Paul");
}
m.appendTail(buf);
System.out.println(buf.toString()); // prints: This Edit ToolBar is a made by Paul
以上运行在 Java 1.4 及更高版本中。在 Java 9+ 中,您可以使用 StringBuilder
代替 StringBuffer
,也可以使用 replaceAll()
通过 lambda 表达式来实现。 :
String s = "This %ToolBar% is a %Content%";
String result = Pattern.compile("%(?:(ToolBar)|(Content))%").matcher(s)
.replaceAll(m -> (m.start(1) != -1 ? "Edit ToolBar" : "made by Paul"));
System.out.println(result); // prints: This Edit ToolBar is a made by Paul
更动态的版本可以在this other answer中看到。 .
关于java - 如何一次性替换一个字符串的多个子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38649267/