如何用替换/正则表达式替换字符串中的两个字符?

时间:2018-09-21 14:41:46

标签: java regex string

我想修改字符串中的两个字符,例如将每个'i'更改为'e',并将每个'e'更改为'i',使文本为"This is a test"将成为"Thes es a tist"

我已经提出了一种可行的解决方案,但是它很无聊而且很优雅:

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);

如何用正则表达式来实现?

2 个答案:

答案 0 :(得分:5)

自Java 9开始,我们可以使用Matcher#replaceAll(Function<MatchResult,String>)。因此,您可以创建正则表达式来搜索ie,并在找到时让函数根据找到的值(例如从地图中)选择替换项

演示

Map<String, String> replacements = Map.ofEntries(
        Map.entry("i", "e"), 
        Map.entry("e", "i")
);
String replaced = Pattern.compile("[ie]")
                         .matcher(yourString)
                         .replaceAll((match) -> replacements.get(match.group()));

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

答案 1 :(得分:2)

比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());
}

"This is a test"上调用,它返回:

Thes es a tist

注意

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