在字符串中交换两个字母

时间:2014-10-11 16:18:08

标签: java regex string

我想在字符串中交换两个字母。例如,如果输入为WH,则字符串中W的所有匹配项都应替换为HH的所有匹配项都应为WWelloHorld取代。字符串HelloWorld将变为str = str.replace('W', 'H');

我知道如何替换单个字符:

{{1}}

但我无法弄清楚如何交换字符。

6 个答案:

答案 0 :(得分:7)

public String getSwappedString(String s)
{
char ac[] = s.toCharArray();
for(int i = 0; i < s.length(); i++)
{
   if(ac[i] == 'H')
     ac[i]='W';
   else if(ac[i] == 'W')
     ac[i] = 'H'; 
}

s = new String(ac);
return s;
}

答案 1 :(得分:6)

使用Java8,它真的很简单

static String swap(String str, String one, String two){
    return Arrays.stream(str.split(one, -1))
        .map(s -> s.replaceAll(two, one))
        .collect(Collectors.joining(two));
}

用法示例:

public static void main (String[] args){
    System.out.println(swap("", "", ""));
}

我建议你不要使用Character作为交换函数,因为它会破坏包含BMP之外字母的字符串

如果你想扩展它以使用任意字符串(不仅仅是字母),你可以引用提供的字符串:

static String swap(String str, String one, String two){
    String patternOne = Pattern.quote(one);
    String patternTwo = Pattern.quote(two);
    return Arrays.stream(str.split(patternOne, -1))
        .map(s -> s.replaceAll(patternTwo, one))
        .collect(Collectors.joining(two));
}

答案 2 :(得分:4)

您可能需要三次替换调用才能完成此操作。

第一个将一个字符更改为中间值,第二个将第一个替换为第二个替换,第三个将第二个替换为第二个替换。

String str = "Hello World";

str = star.replace("H", "*").replace("W", "H").replace("*", "W");

修改

回答以下关于在String中交换字符的方法的正确性的一些问题。即使*中已存在String,这也会有效。但是,这需要额外的步骤:在返回新的*之前首先转义String的任何事件并取消转义。

public static String replaceCharsStar(String org, char swapA, char swapB) {
    return org
            .replace("*", "\\*")
            .replace(swapA, '*')
            .replace(swapB, swapA)
            .replaceAll("(?<!\\\\)\\*", "" + swapB)
            .replace("\\*", "*");

}

修改2

在阅读了其他一些答案之后,一个不仅仅适用于Java 8的新版本可以替换需要在正则表达式中转义的字符,例如: []并考虑了使用char原语操纵String个对象的问题。

public static String swap(String org, String swapA, String swapB) {
    String swapAEscaped = swapA.replaceAll("([\\[\\]\\\\+*?(){}^$])", "\\\\$1");
    StringBuilder builder = new StringBuilder(org.length());

    String[] split = org.split(swapAEscaped);

    for (int i = 0; i < split.length; i++) {
        builder.append(split[i].replace(swapB, swapA));
        if (i != (split.length - 1)) {
            builder.append(swapB);
        }
    }

    return builder.toString();

}

答案 3 :(得分:3)

一种稍微好一点的字符串扫描方法,没有显式数组和索引访问:

StringBuilder sb = new StringBuilder();
for (char c : source_string.toCharArray()) {
  if (c == 'H') sb.append("W");
  else if (c == 'W') sb.append("H");
  else sb.append(c);
}
return sb.toString();

答案 4 :(得分:2)

您可以遍历String的字符数组,并在看到任何一个字符时进行交换:

private static String swap(String str, char one, char two) {
    char[] chars = str.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        if (chars[i] == one) {
            chars[i] = two;
        } else if (chars[i] == two) {
            chars[i] = one;
        }
    }
    return String.valueOf(chars);
}

答案 5 :(得分:-1)

您也可以尝试使用此代码。

System.out.println("WelloHorld".replaceAll("W", "H~").replaceAll("H(?!~)", "W").replaceAll("(?<=H)~", ""));

输出:

HelloWorld

使用输入字符串中不存在的任何字符而不是~