Ответ 1
Строка неизменяема, что означает, что ссылка html не изменяется, вместо этого метод replace возвращает новый объект String, который вы должны назначить.
html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue());
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());
}
Обычно это заменяет обе строки, но это не так. Кто-нибудь имеет идею?
Строка неизменяема, что означает, что ссылка html не изменяется, вместо этого метод replace возвращает новый объект String, который вы должны назначить.
html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue());
Метод replace возвращает результат, который вы отбрасываете.
Вам не нужно скрывать символ *
. Разница между replace
и replaceAll
заключается в том, что replace
автоматически сбрасывает любые метасимволы регулярных выражений для нас:
String delimiter = "**";
как сказано, что вы отбрасываете результаты и заменяете, не требуется регулярное выражение только буквальная последовательность 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()));
}
Аналогия:
Если на рабочем столе есть неизменяемый файл. Чтобы внести некоторые изменения, вы делаете копию и заменяете. Это приводит к состоянию, в котором вы не можете получить доступ к старому файлу, если у вас нет резервной копии.
Точно так же на большинстве компьютерных языков, таких как Java
, JavaScript
, python
и C#
, метод replace
не заменяет/не изменяет строку. Он работает только над предыдущей строкой и возвращает новую строку со всеми изменениями.
Теперь, если вы действительно хотите сохранить изменения, вам понадобится вернуть возвращенную строку в ту же переменную (если позволяет ваша ситуация) или в новую переменную.
String - неизменяемый тип, поэтому мы должны создать объект String для сохранения новой строки, возвращаемой методом replace
html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue());