我想在每个元音之前插入“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
来自原始文本以及O
中的OBA
。
例如,对于"I WON'T"
我想要输出"OBI WOBON'T"
,而是提供"OBOBI WOBON'T"
,因为来自第一行的O
的{{1}}被视为元音。
我需要一个不会从加密中替换新OBI
的解决方案。
答案 0 :(得分:7)
由于replaceAll
采用正则表达式,因此您可以在替换字符串中使用对捕获元素的引用:
out=out.replaceAll("[AEIOUY]", "OB$0");
[AEIOUY]
从AEIOUY
列表$0
代表已捕获的字符。这是demo。
答案 1 :(得分:3)
您可以使用$1
引用匹配的群组,因此请替换为AB$1
:
out.replaceAll("([AEIOUY])", "OB$1")
答案 2 :(得分:1)
移动" 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");
答案 3 :(得分:1)
如果您不想使用正则表达式:
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);
答案 4 :(得分:-1)
也可以这样做,用' - '替换OB(我们可以肯定的任何2个字符都不会出现在字符串中),最后用OB替换它们:
public static void main(String [] args){ String text =“我不会”;
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