как заменить слово Java в строке используя substring?
Что нужно сделать? Есть два переменных text и word. Слово в word в text должны изменить на "*" используя substring. Нужно удалить в начале и в конце, при этом добавить int before, int after. Пока что на этапе int posBefore = text.indexOf(word); Какие действия дальше? #Java
Ответы (1 шт):
Автор решения: Alex Rudenko
→ Ссылка
- Проверяем, содержится ли
wordвtext-- тогдаtext.indexOf(word)вернёт значение, большее -1. - Затем "строим" замену для слова
wordиз звёздочек. Проще всего это сделать используя методString::repeat, добавленный в Java 11, но также можно создать такую строку в цикле, используяCollections.nCopiesи другими способами. - Проверяем в цикле, является ли 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()));
}