【问题标题】:How to replace two characters in a String with replace/regex?如何用替换/正则表达式替换字符串中的两个字符?
【发布时间】:2018-09-21 14:41:45
【问题描述】:

我想修改字符串中的两个字符,例如将每个'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);

如何使用正则表达式来完成?

【问题讨论】:

  • @feelingunwelcome,重复是关于交换 两个 字符(改变它们的位置),而这是关于 改变 个不同的字符,而 替换 字符甚至根本不需要存在于原始字符串中。

标签: java regex string


【解决方案1】:

从 Java 9 开始,我们可以使用 Matcher#replaceAll(Function&lt;MatchResult,String&gt;)。所以你可以创建正则表达式,它将搜索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()));

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

【讨论】:

  • 这是一个非常酷的解决方案,但不幸的是,我使用的是 Java 8。
  • 我想提醒一下,Java 11 将在本月发布。无论如何,使用地图选择替换也可以应用于您自己的解决方案而不是ifs。
【解决方案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

注意

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

【讨论】:

  • 我们也可以使用ifs 代替Map&lt;String, String&gt; replacementsmap(s-&gt;replacements.getOrDefault(s,s))sreplacement 没有s 键的情况下返回。
猜你喜欢
  • 2018-07-13
  • 2012-04-26
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
相关资源
最近更新 更多