как заменить слово Java в строке используя substring?

Что нужно сделать? Есть два переменных text и word. Слово в word в text должны изменить на "*" используя substring. Нужно удалить в начале и в конце, при этом добавить int before, int after. Пока что на этапе int posBefore = text.indexOf(word); Какие действия дальше? #Java


Ответы (1 шт):

Автор решения: Alex Rudenko
  1. Проверяем, содержится ли word в text -- тогда text.indexOf(word) вернёт значение, большее -1.
  2. Затем "строим" замену для слова word из звёздочек. Проще всего это сделать используя метод String::repeat, добавленный в Java 11, но также можно создать такую строку в цикле, используя Collections.nCopies и другими способами.
  3. Проверяем в цикле, является ли pos > 1, и в теле цикла переприсваиваем text, складывая подстроки, полученные при помощи String::substring):
  • префикс: от нулевой позиции до pos
  • замаскированное значение из N звёздочек, где N = word.length()
  • суффикс: от позиции pos + word.length()

Примерная реализация:

static String maskAllWords(String text, String word) {
    int pos = text.indexOf(word);
    if (pos > -1) {
        String mask = "*".repeat(word.length());
        while (pos > -1) {
            int posAfter = pos + word.length();
            text = text.substring(0, pos) + mask + text.substring(posAfter);
            pos = text.indexOf(word, posAfter);
        }
    }
    return text;
}

Убрав цикл, можно заменять только первое вхождение word:

static String maskFirstWord(String text, String word) {
    int pos = text.indexOf(word);
    if (pos > -1) {
        String mask = "*".repeat(word.length());
        int posAfter = pos + word.length();
        text = text.substring(0, pos) + mask + text.substring(posAfter);
        pos = text.indexOf(word, posAfter);
    }
    return text;
}

Также данную задачу можно решить при помощи методов String::replaceAll / String::replaceFirst, преобразовав word в литерал:

static String maskWordRegex(String text, String word) {
    return text.replaceAll("\\Q" + word + "\\E", "*".repeat(word.length()));
}
→ Ссылка