Java String заменить не работает

java string replace

37564 просмотра

6 ответа

String delimiter = "\\*\\*";
String html = "<html><head></head><body>**USERNAME** AND **PASSWORD**</body></html>";
Map<String, String> mp = new HashMap<String, String>();
mp.put("USERNAME", "User A");
mp.put("PASSWORD", "B");
for (Entry<String, String> entry : mp.entrySet()) {
  html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue());
}

Это обычно должно заменить обе эти строки, но это не так. У кого-нибудь есть идея?

Автор: Vilius Источник Размещён: 12.11.2019 09:08

Ответы (6)


50 плюса

Решение

String является неизменяемой, что означает, что html-ссылка не изменяется, а метод replace возвращает новый объект String, который вы должны назначить.

html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue());
Автор: Yishai Размещён: 02.06.2011 07:20

6 плюса

Метод replace возвращает свой результат, который вы отбрасываете.

Автор: MRAB Размещён: 02.06.2011 07:19

4 плюса

Вам не нужно избегать *персонажа. Разница между replaceи replaceAllзаключается в том, что replaceмы автоматически избегаем любых метасимволов регулярных выражений:

String delimiter = "**";
Автор: Grzegorz Szpetkowski Размещён: 02.06.2011 07:23

1 плюс

как уже говорилось, вы отбрасываете результаты, а замена не требует регулярного выражения только буквенной последовательности символов для замены, поэтому вам не нужно экранировать в разделителе

но replaceAll и replaceFirst принимают строку регулярного выражения (плохой дизайн)

кроме того, желательно использовать Patter.quote(String)и Matcher.quoteReplacement(String)гарантировать, что при использовании регулярных выражений не происходит никаких странных вещей (это немного проще и гарантирует отсутствие ошибок при выходе из символов)

здесь, когда только один случай должен быть заменен

String delimiter = "**";
String html = "<html><head></head><body>**USERNAME** AND **PASSWORD**</body></html>";
Map<String, String> mp = new HashMap<String, String>();
mp.put("USERNAME", "User A");
mp.put("PASSWORD", "B");
for (Map.Entry<String, String> entry : mp.entrySet()) {
  html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue());
}

и вот для того, когда несколько вхождений должны быть заменены

String delimiter = "**";//unescaped because I'm handling that in my replace 
String html = "<html><head></head><body>**USERNAME** AND **PASSWORD**</body></html>";
Map<String, String> mp = new HashMap<String, String>();
mp.put("USERNAME", "User A");
mp.put("PASSWORD", "B");
for (Map.Entry<String, String> entry : mp.entrySet()) {
  html = html.replaceAll(Pattern.quote(delimiter + entry.getKey()+ delimiter), Matcher.quoteReplacement(entry.getValue()));
}
Автор: ratchet freak Размещён: 02.06.2011 07:42

1 плюс

Аналогия:

Если у вас есть неизменный файл на рабочем столе. Чтобы внести некоторые изменения, вы делаете копию и заменяете. Это приводит к состоянию, при котором вы не можете получить доступ к старому файлу, если у вас нет резервной копии.

Точно так же в большинстве компьютерных языков , таких как Java, JavaScript, pythonи метод не заменяет / изменить строку. Он работает только над предыдущей строкой и возвращает новую строку со всеми изменениями.C#replace

Теперь, если вы действительно хотите сохранить изменения, вам нужно получить возвращенную строку в той же переменной (если позволяет ваша ситуация) или в новой переменной.

Автор: Identity1 Размещён: 14.09.2015 10:50

1 плюс

String является неизменным типом, поэтому мы должны создать новый объект String, чтобы сохранить новую строку, возвращаемую методом replace.

html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue());
Автор: Wung Lou Размещён: 30.11.2015 12:28
Вопросы из категории :
32x32