如何在一行中替换多个字符串?
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"
,因为来自第一行 OBI
的 O
已被视为元音.
我需要一个解决方案,它不会从加密中替换新的 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);
我想在每个元音前插入 "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"
,因为来自第一行 OBI
的 O
已被视为元音.
我需要一个解决方案,它不会从加密中替换新的 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);