如何在一行中替换多个字符串?

How to replace more than a string in one line?

我想在每个元音前插入 "OB"。我试过下面的代码:

String out=txt.toUpperCase();

out=out.replaceAll("A","OBA");
out=out.replaceAll("E","OBE");
out=out.replaceAll("I","OBI");
out=out.replaceAll("O","OBO");
out=out.replaceAll("U","OBU");
out=out.replaceAll("Y","OBY");

当我使用上面的代码时,它将 A 替换为 OBA,但是当涉及到将 O 替换为 OBO 时,它替换了 O来自原文以及OBA中的O。 例如,对于 "I WON'T",我想要输出 "OBI WOBON'T",但它给出了 "OBOBI WOBON'T",因为来自第一行 OBIO 已被视为元音.

我需要一个解决方案,它不会从加密中替换新的 O

由于 replaceAll 采用正则表达式,您可以在替换字符串中使用对捕获元素的引用:

out=out.replaceAll("[AEIOUY]", "OB[=10=]");
  • [AEIOUY]AEIOUY 列表中捕获单个字符
  • 替换字符串中的
  • [=14=]代表已经捕获的字符

这里是demo.

您可以参考</code>匹配的组,所以替换为<code>AB

out.replaceAll("([AEIOUY])", "OB")

将 "O"、"OBO" 移到开头将防止重复

String out=txt.toUpperCase();

out=out.replaceAll("O","OBO");
out=out.replaceAll("A","OBA");
out=out.replaceAll("E","OBE");
out=out.replaceAll("I","OBI");
out=out.replaceAll("U","OBU");
out=out.replaceAll("Y","OBY");

也可以这样做,将OB替换为'-@'(我们可以确定的任何2个字符都不会出现在字符串中)最后替换为OB:

public static void main(String[] args) { 字符串文本 = "I WON'T";

text = text.replaceAll("A", "-@A");
text = text.replaceAll("E", "-@E");
text = text.replaceAll("I", "-@I");
text = text.replaceAll("O", "-@O");
text = text.replaceAll("U", "-@U");
text = text.replaceAll("Y", "-@Y");
System.out.println(text);       
text = text.replaceAll("-@", "OB");     
System.out.println(text);
}

产出

-@I W-@ON'T OBI WOBON'T

如果您不想使用正则表达式:

HashMap<Character, String> replace = new HashMap<Character, String>() {{
            put('A',"OBA");
            put('E',"OBE");
            put('I',"OBI");
            put('O',"OBO");
            put('U',"OBU");
            put('Y',"OBY");
}};

final StringBuilder res = new StringBuilder();
String test = "I WON'T";

test
 .chars()
 .mapToObj(c -> (char) c)
 .forEach(c -> res.append(replace.getOrDefault(c, Character.toString(c))));
System.out.println(res);