【问题标题】:Java String replace not working [duplicate]Java字符串替换不起作用[重复]
【发布时间】:2011-09-07 08:04:09
【问题描述】:
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());
}

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

【问题讨论】:

  • 你怎么知道它不起作用?您没有在任何地方打印或存储它。

标签: java string replace


【解决方案1】:

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

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

【讨论】:

  • 刚刚测试过,但没有成功。新的字符串不会被替换。 --编辑:在我调整了分隔符之后,非常棒。
  • 这是正确答案。
  • 不变性是罪魁祸首!
  • 字符串 longitudeString=siteResult.getString("longitude").toString().replaceAll(" ","");这是一个 jdbc 示例。没有工作“替换或全部替换”
  • @withoutOne 那么你有一个不同的问题。您的代码将导致 longitudeString 中没有任何空格。
【解决方案2】:

replace 方法返回其结果,您将丢弃该结果。

【讨论】:

    【解决方案3】:

    您无需转义 * 字符。 replacereplaceAll 之间的区别在于 replace 会自动为我们转义任何正则表达式元字符:

    String delimiter = "**";
    

    【讨论】:

    • 非常感谢 - 我不得不将你的提示与 Yishai 的提示合并。
    【解决方案4】:

    如前所述,您将丢弃结果,并且 replace 不需要正则表达式,只需替换文字字符序列,因此您无需在分隔符中转义

    但 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】:

    类比:

    如果您的桌面上有一个不可变文件。要进行一些更改,您需要进行复制和替换。这会导致您无法访问旧文件,除非您有备份。

    在大多数计算机语言(如JavaJavaScriptpythonC#)中,replace 方法不会替换/修改字符串。它只对以前的 String 进行操作,并返回一个包含所有更改的新 String。

    现在,如果您真的想存储更改,则需要将返回的字符串放入同一变量(如果您的情况允许)或新变量中。

    【讨论】:

      【解决方案6】:

      String是不可变类型,所以我们应该新建一个String对象来保存replace方法返回的新String

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-25
        • 2013-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-23
        • 2018-08-26
        • 2013-09-14
        相关资源
        最近更新 更多