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());
}
通常应该替换这两个字符串,但事实并非如此。有没有人有想法?
答案 0 :(得分:49)
String是不可变的,这意味着html引用不会改变,而是replace方法返回一个你必须分配的新String对象。
html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue());
答案 1 :(得分:6)
replace方法返回你要丢弃的结果。
答案 2 :(得分:4)
您无需转义*
字符。 replace
和replaceAll
之间的区别在于replace
会自动为我们转义任何正则表达式元字符:
String delimiter = "**";
答案 3 :(得分: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()));
}
答案 4 :(得分:1)
String是一个不可变类型,所以我们应该新建一个String对象来保存由replace方法返回的新String
html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue());