java - 如何一次性替换一个字符串的多个子字符串?

标签 java android

我希望替换 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/

相关文章:

android - 在与主机 Android 设备连接的 Gear 2 模拟器上运行的 Gear 2 应用程序中进行 web api 调用的问题

android - 如何在 Cordova 中设置 android.enableAapt2=false?

android - 自动完成库 - 跨浏览器/移动兼容

android - 如何在 Android 应用程序中管理受限配置文件?

java - Opencv Java 灰度

java - 当 i 给出输入 n 个元素时,显示输出 n 个元素?

java - try block 内的 try catch 语句

java - 在java中的通用类内部进行转换

java - 当文件大小发生变化时,Struts DiskFile.getInputStream() 返回 ByteArrayInputStream 和 FileArrayInputStream

java - 如何处理 Activity 标题随 Fragment 变化的情况