Как заменить два символа в строке заменить / регулярное выражение? - PullRequest
0 голосов
/ 21 сентября 2018

Я хочу изменить два символа в строке, например, изменить каждый '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 голосов
/ 21 сентября 2018

Менее элегантное решение, чем у 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

Примечание

Как уже упоминалось, ваше решение подходит как для одиночных символов.

0 голосов
/ 21 сентября 2018

Начиная с Java 9 мы можем использовать Matcher#replaceAll(Function<MatchResult,String>).Таким образом, вы можете создать регулярное выражение, которое будет искать либо i, либо e, и когда оно найдет его, пусть функция выберет замену на основе найденного значения (как на карте)

Demo

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

Но, честно говоря, ваше решение не выглядит плохо, особенно если оно используется для поиска отдельных символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...