在字符串中交换两个字母

Jai*_*dra 9 java regex string

我想在一个字符串中交换两个字母.例如,如果输入是W,HW字符串中的H所有匹配项H都应替换为,并且所有出现的值应替换为W.字符串WelloHorld将成为HelloWorld.

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

str = str.replace('W', 'H');
Run Code Online (Sandbox Code Playgroud)

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

Arj*_*una 8

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;
}
Run Code Online (Sandbox Code Playgroud)


ber*_*rio 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));
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

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

我建议你不要使用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));
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*erK 5

您可能需要三个replace调用才能完成此操作。

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

String str = "Hello World";

str = star.replace("H", "*").replace("W", "H").replace("*", "W");
Run Code Online (Sandbox Code Playgroud)

编辑

针对以下有关这种字符交换方法的正确性的担忧String。即使已经有一个*,这也将起作用String。但是,这需要额外的步骤,首先*返回所有出现的值并对其进行转义,然后再返回new String

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

}
Run Code Online (Sandbox Code Playgroud)

编辑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();

}
Run Code Online (Sandbox Code Playgroud)

  • 如果字符串已经包含'*'怎么办?然后,修改不需要的字符。 (3认同)