Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何用replace/regex替换字符串中的两个字符?_Java_Regex_String - Fatal编程技术网

Java 如何用replace/regex替换字符串中的两个字符?

Java 如何用replace/regex替换字符串中的两个字符?,java,regex,string,Java,Regex,String,我想修改字符串中的两个字符,例如将每个'I'更改为'e',将每个'e'更改为'I',这样像“这是一个测试”这样的文本将变成“这是一个测试” 我提出了一个可行的解决方案,但它既无聊又不雅观: String input = "This is a test"; char a = 'i'; char b = 'e'; char[] chars = input.toCharArray(); for(int i = 0; i < chars.length; i++) { if(chars[i

我想修改字符串中的两个字符,例如将每个
'I'
更改为
'e'
,将每个
'e'
更改为
'I'
,这样像
“这是一个测试”
这样的文本将变成
“这是一个测试”

我提出了一个可行的解决方案,但它既无聊又不雅观:

String input = "This is a test";
char a = 'i';
char b = 'e';

char[] chars = input.toCharArray();
for(int i = 0; i < chars.length; i++) {
    if(chars[i] == a) {
        chars[i] = b;
    }else if(chars[i] == b) {
        chars[i] = a;
    }
}

input = new String(chars);
String input=“这是一个测试”;
字符a='i';
字符b='e';
char[]chars=input.toCharArray();
for(int i=0;i
如何使用regex实现这一点?

因为我们可以使用Java 9。因此,您可以创建regex,它将搜索
i
e
,当它找到它时,让函数根据找到的值选择替换(如来自map)

演示

Map replacements=Map.ofEntries(
地图条目(“i”、“e”),
地图条目(“e”、“i”)
);
字符串替换=模式。编译(“[ie]”)
.matcher(你的字符串)
.replaceAll((match)->replacements.get(match.group());

但老实说,您的解决方案看起来不错,尤其是当它用于搜索单个字符时。

这是一个不如Pschemo优雅的解决方案,但从Java 8开始就可以使用:

static String swap(String source, String a, String b) {
    // TODO null/empty checks and length checks on a/b
    return Arrays
        // streams single characters as strings
        .stream(source.split(""))
        // maps characters to their replacement if applicable
        .map(s -> {
            if (s.equals(a)) {
                return b;
            }
            else if (s.equals(b)) {
                return a;
            }
            else {
                return s;
            }
        })
        // rejoins as single string
        .collect(Collectors.joining());
}
上调用“这是一个测试”
,它返回:

Thes es a tist
注意


正如其他人提到的,您的解决方案和单字符的解决方案一样好。

这是一个非常酷的解决方案,但不幸的是,我使用的是Java 8。我想提醒一下,Java 11将在本月发布。无论如何,在您自己的解决方案中也可以使用map来选择替换,而不是
if
s。我们还可以使用
if
s
map替换和
map(s->replacements.getOrDefault(s,s))
replacement
没有
s
键的情况下返回
s
。@feelingwelcome重复是关于交换两个字符(改变它们的位置),而这是关于用不同的字符来改变字符,而替换字符甚至不需要存在于原始字符串中。
Thes es a tist