Подтвердить что ты не робот

Java 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 (Entry<String, String> entry : mp.entrySet()) {
  html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue());
}

Обычно это заменяет обе строки, но это не так. Кто-нибудь имеет идею?

4b9b3361

Ответ 1

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

html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue());

Ответ 2

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

Ответ 3

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

String delimiter = "**";

Ответ 4

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

но 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()));
}

Ответ 5

Аналогия:

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

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

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

Ответ 6

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

html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue());