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

时间:2017-07-30 11:54:05

标签: java regex replaceall

我想在每个元音之前插入“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的解决方案。

5 个答案:

答案 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