Java String替换不起作用

时间:2011-06-02 19:17:06

标签: java string replace

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

通常应该替换这两个字符串,但事实并非如此。有没有人有想法?

5 个答案:

答案 0 :(得分:49)

String是不可变的,这意味着html引用不会改变,而是replace方法返回一个你必须分配的新String对象。

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

答案 1 :(得分:6)

replace方法返回你要丢弃的结果。

答案 2 :(得分:4)

您无需转义*字符。 replacereplaceAll之间的区别在于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());
相关问题