如何在JAVA中用不同的子字符串替换字符串的子字符串?

Posted

技术标签:

【中文标题】如何在JAVA中用不同的子字符串替换字符串的子字符串?【英文标题】:How to replace substrings of string with different substrings in JAVA? 【发布时间】:2022-01-22 13:28:42 【问题描述】:

我必须用不同的字符串替换单个字符串的不同子字符串。例如

 String str =" She was born on DATE at TIME on DAY";

我想用不同的字符串值替换字符串的 DATE、TIME 和 DAY 部分。使用replace(),我可以只替换字符串的一部分。但我正在寻找一种解决方案,一次用不同的字符串替换所有这些子字符串。

【问题讨论】:

我认为这是不可能的。您应该显示您当前正在使用的代码。 【参考方案1】:

您可能做的最好的事情就是使用迭代正则表达式方法:

String str = "She was born on DATE at TIME on DAY";
Map<String, String> repl = new HashMap<>();
repl.put("DATE", "DATE_REPL");
repl.put("TIME", "TIME_REPL");
repl.put("DAY", "DAY_REPL");

Pattern pattern = Pattern.compile("\\b(DATE|TIME|DAY)\\b");
Matcher m = pattern.matcher(str);
StringBuffer buffer = new StringBuffer();
  
while(m.find()) 
    m.appendReplacement(buffer, repl.get(m.group(1)));
  
m.appendTail(buffer);

System.out.println("input:  " + str);
System.out.println("output: " + buffer.toString());

打印出来:

input:  She was born on DATE at TIME on DAY
output: She was born on DATE_REPL at TIME_REPL on DAY_REPL

在这里,我们正在搜索正则表达式替换 \b(DATE|TIME|DAY)\b。每次在字符串中找到匹配项时,我们都会在 hashmap 中查找替换字符串。

【讨论】:

【参考方案2】:

这样做的最简单方法是将日期、时间和日期设为单独的变量,这样

String str = "She was born on " + date + " at " + time + " on " + day;

【讨论】:

【参考方案3】:

内置的字符串替换不支持替换多次出现。因此,您需要编写自己的方法来执行此操作。

下面的代码假定oldstuff 包含唯一的字符串。如果它们不是唯一的,您将不得不编写不同的解决方案。

   public static void main(String[] args) 
        String original = " She was born on DATE at TIME on DAY";
        String[] oldstuff = "DATE", "TIME", "DAY";
        String[] newstuff = "Feb 14, 2000", "midnight", "Tuesday";

        System.out.println(original);
        String updated = replace(original, oldstuff, newstuff);
        System.out.println(updated);

    

    static String replace(String str, String[] oldstuff, String[] newstuff) 
        for (int i = 0; i < oldstuff.length; i++) 
            str = str.replace(oldstuff[i], newstuff[i]);
        
        return str;
    

输出:

 She was born on DATE at TIME on DAY
 She was born on Feb 14, 2000 at midnight on Tuesday

更好的解决方案是逐字扫描,只替换找到的匹配项。

    static String replace2(String str, String[] oldstuff, String[] newstuff)
        StringBuilder sb = new StringBuilder();
        java.util.Scanner s = new Scanner(str);
        int index = 0;
        while(s.hasNext())
            String word = s.next();
            if (word.equals(oldstuff[index]))
                sb.append(" ").append(newstuff[index]).append(" ");
                index++;
             else 
                sb.append(" ").append(word).append(" ");
            
        
        
        return sb.toString();
    

【讨论】:

请注意,这种方法的一个缺点是它需要单独调用 replace 来替换 each 关键字。 是的,或者您可以逐个字符进行低级扫描以查找匹配项并使用 StringBuilder 构建新字符串。 或使用扫描仪逐字扫描,将单词添加到字符串生成器。如果单词匹配,则添加替换而不是原始单词。【参考方案4】:

一口气

String str =" She was born on DATE at TIME on DAY";
str = str.replaceAll("DATE", "2021-12-21").replaceAll("TIME", "11:20").replaceAll("DAY", "Tue");

【讨论】:

【参考方案5】:

试试这个。

public static void main(String[] args) 
    String str =" She was born on DATE at TIME on DAY";

    List<String> list = List.of("(date)", "(time)", "(day)");
    Iterator<String> iterator = list.iterator();
    String output = Pattern.compile("DATE|TIME|DAY").matcher(str)
        .replaceAll(m -> iterator.next());

    System.out.println(output);

输出:

 She was born on (date) at (time) on (day)

或者

    Map<String, String> map = Map.of("DATE", "(date)", "TIME", "(time)", "DAY", "(day)");
    String output = Pattern.compile(String.join("|", map.keySet())).matcher(str)
        .replaceAll(m -> map.get(m.group()));
    System.out.println(output);

【讨论】:

【参考方案6】:

您可以简单地使用 String.format("她于 %s 于 %s 出生于 %s",date ,time,day)

【讨论】:

以上是关于如何在JAVA中用不同的子字符串替换字符串的子字符串?的主要内容,如果未能解决你的问题,请参考以下文章

当您有重复的子字符串时如何正确替换字符串?

如何替换字符串的子字符串[重复]

将双括号内的子字符串替换为javascript中的不同字符串

一个字符串中替换多个字符怎么做

如何在特定字符之前替换字符串的子字符串?

如何在 Netezza 中替换完整的子字符串