【问题标题】:removing a char from an array of Strings从字符串数组中删除一个字符
【发布时间】:2015-04-13 09:11:41
【问题描述】:

我一直在尝试从字符串数组中删除特定字符,但仍然失败。字符是“$”,我不知道我做错了什么,所以希望有人能够指出正确的方向,我的代码:

for (int y = 0; y<possibleAnswers.length;y++) {
        display = possibleAnswers[y].replaceAll("$", "");
        System.out.println(display);
    }

possibleAnswers 包含 4 个字符串,其中 4 个字符串中有一个“$”,我想在显示之前将其删除。

当我运行上面的代码时,会显示“$”,有什么想法吗?

【问题讨论】:

  • 你完全误解了replaceAll的目的。您应该阅读文档并发现,replaceAll 是替换正则表达式的方法,而不仅仅是精确匹配的字符串。这里应该使用replace
  • 除了 Dmitry Ginzburg 所说的。在正则表达式中,$ 具有特殊含义,即行尾。意味着,您正在用空白替换行尾字符。
  • 抱歉,您的回答是正确的,我现在在我的代码中使用它,这就是我正在寻找的方法。我没有阅读文档,这是我的错。
  • Ashwani,我正在制作一个“谁想成为百万富翁”的游戏,这就是为什么我有一个由四个字符串组成的数组,其中一个有一个 $ 符号表示正确答案。我想在显示之前将其删除,但在此之前,请记录正确答案,以便稍后与用户输入进行比较。我还有什么其他选择?我应该使用不同的字符吗?还是有完全不同且更有效的方法?

标签: java arrays string replace char


【解决方案1】:

您的代码的问题是replaceAll() 需要一个“正则表达式”。 $ 字符在正则表达式中使用时具有特定含义。因此,您有两种选择:

  1. 继续使用replaceAll();那么你必须“逃避特殊字符”;使用replaceAll("\\$", ""),或其他人指出的“[$]”。
  2. 使用不期望“正则表达式模式字符串”的其他方法,例如 replace()

【讨论】:

  • For 1 也可以做 replaceAll ("[$]", "");
  • 正如我在另一个答案中已经指出的那样,replace(char, char) 也适合:docs.oracle.com/javase/7/docs/api/java/lang/…,但在这种情况下你不能使用,因为没有“空”符号。
【解决方案2】:

replaceAll() 接受一个正则表达式,而不仅仅是一个字符。当您说“$”时,您并不是在告诉它匹配“$”字符,而是匹配字符串的结束位置或字符串结尾之前的换行符之前。

您需要转义“$”,这样它就知道只匹配字符,而不是将其视为特殊的正则表达式含义。

这样做:possibleAnswers[y].replaceAll("\\$", "");

【讨论】:

    【解决方案3】:

    在您的代码中,$regex 中是keyword,用于匹配end of line,即$。所以你必须escape它如下。

    display = possibleAnswers[y].replaceAll("\\$", "");
    

    【讨论】:

      【解决方案4】:

      试试

      possibleAnswers[y].replaceAll("\\$", "");
      

      转义字符,因为$ 是正则表达式中的特殊字符,并且由于replaceAll() 采用正则表达式,因此您传递的字符串无法识别。

      你也可以使用replace() 接受字符串

       possibleAnswers[y].replace("$", "");
      

      【讨论】:

      • 而更好的解决方案就是把replaceAll换成replace,那就不用转义了。
      • 您的回答解决了眼前的问题;但根本没有解释为什么这会起作用。
      • 我使用了 replace 而不是 replaceAll 并且它起作用了,感谢 Dmitry,singhakash 的回答也是正确的,感谢您的解释,我不知道我必须以不同的方式识别特殊字符。为什么特殊字符在替换方法中没有 // 而不是 replaceAll?
      • @DmitryGinzburg 但是如果这个人不注意,那么他可能会转向“replace(char, char)”——它只替换一次;不是“全部”。所以在谈论“更好”的解决方案时要小心。
      【解决方案5】:

      只需使用 possibleAnswers[y].replace("$", "");从字符串中删除“$”。

      【讨论】:

      • 如前所述:您的回答解决了手头的问题;但根本没有解释为什么这会起作用。
      • public String replace(CharSequence paramCharSequence1, CharSequence paramCharSequence2) { return Pattern .compile(paramCharSequence1.toString(), 16) .matcher(this) .replaceAll( Matcher.quoteReplacement(paramCharSequence2.toString()) ); }
      • 如果您想改进答案,请编辑您的答案。顺便说一句:仅添加您在评论中添加的代码不会提高答案的质量。关键是:您的答案缺少解释。更多代码什么也解释不了
      • 据我所知,replaceAll 只接受正则表达式字符串,与 replace() 函数相比,编译目标字符串需要更多时间..
      • 更多解释:两个函数中的 Pattern.compile() 函数需要不同的时间来编译,因为 replace() 函数将输入作为 CharSequence 给 compile() 函数,replaceAll() 函数将输入给 compile( ) 函数作为正则表达式字符串,这将需要更多时间来编译。
      【解决方案6】:
      for (int y = 0; y < possibleAnswers.length; y++) {
              display = possibleAnswers[y].replace("$", "");
              System.out.println(display);
          }
      

      按照建议,我使用了 replace 方法而不是 replaceAll,它完成了工作。同时,我学会了查看文档以更深入地了解这些方法。

      感谢大家的帮助,真的很感激。

      【讨论】:

        猜你喜欢
        • 2013-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-12
        • 2023-03-14
        • 1970-01-01
        • 2020-05-18
        相关资源
        最近更新 更多