【问题标题】:String Replacement Error: id.replace(ch, "") not working字符串替换错误:id.replace(ch, "") 不起作用
【发布时间】:2017-10-08 13:14:02
【问题描述】:

我正在尝试替换字符串中的字符

for (String word : stringArray){
    int k = 33;
    char d ="";
    while (k < 64){
        char c = k;
        word = word.replace(c, ""); // THIS LINE GIVES AN ERROR
        k++;
    }
}

我正在尝试删除 ASCII id 32 (!) 和 ASCII id 64 (@) 之间的所有非字母字符,包括在内。我使用stringid.replace(char, char) 作为suggested here

但是,替换的第二个参数中的"" 在 Eclipse 中被视为字符串,这会给出“类型不匹配”的错误(因为替换需要两个字符的参数)。

我尝试过'' 而不是"",但这似乎无法解决问题。我该怎么办?提前致谢。

编辑:将 word.replace(c, ""); 更改为 word = word.replace(c,""); 。感谢评论者指出这一点。但是,问题仍然存在。

【问题讨论】:

  • 您忘记阅读链接到的答案的第一句话:Java 中的字符串是不可变的。 word.replace(c, "") 不会更改字符串,因为字符串是不可变的,无法更改。
  • 谢谢。我会将有问题的行编辑为此word = word.replace(c, ""); ...但是,我要问的问题仍然存在:(
  • ^ 完全重复,并确保阅读第二个答案,这是正确的。
  • @AndrewLi 谢谢!所以本质上,对于我想要做的事情, str replace 不是我需要的......你能建议一个替代方案吗?

标签: java string replace str-replace


【解决方案1】:

您必须更改相当多的代码才能使其正常工作:

for (int i = 0; i < stringArray.length; i++) {
    int k = 33;
    while (k < 64){
        stringArray[i] = stringArray[i].replace("" + k, "");
        k++;
    }

}

重点是:

  • 字符串是不可变的,所以如果你修改它们,你必须重新分配它们
  • 如果你在for循环中修改了一个迭代变量,数组中的原始值不会改变,你还必须在数组中重新赋值
  • 没有“空字符”,所以替换必须在字符串之间

【讨论】:

  • 是的,这是正确的答案 - for (String word : stringArray) 将每个元素的副本分配给 word,而不是引用。
  • @ÓscarLópez 谢谢,+1 !
  • 嗯,事实证明这不起作用,我认为它需要replaceAll ?
  • @ZubinMukerjee replace() 已经替换了给定字符串的 所有 次出现(检查docs),replaceAll() 不同,因为它采用正则表达式作为参数.也许需要替换的字符不在您假设的范围内?我不知道,我不知道你的意见是什么。
【解决方案2】:

为什么不将所有要替换的字符放在一个单独的字符串中,并使用正则表达式从字符串中全部替换?

String charsToBeReplaced = "[!\"#$%&'()*+,-.\\/0123456789:;<=>?@]"; //your ASCII 33 to 64 characters... notice that forward slash and double quotes is escaped here

for (int i=0; i<stringArray.length; i++){
    stringArray[i] = stringArray[i].replaceAll(charsToBeReplaced, "");
}

DEMO

【讨论】:

    【解决方案3】:

    只是为了使用正则表达式提出另一个答案:

    Pattern p = Pattern.compile("[\\x21-\\x40]");
    for (int i=0; i<stringArray.length; i++){
        stringArray[i] = p.matcher(stringArray[i]).replaceAll("");
    }
    

    这可能比Raman Sahasi's answer 更有效,因为我们只需要编译一次模式。

    【讨论】:

    • 我相信这行得通,但现在对我来说它看起来很神奇 - 我将不得不阅读Pattern ...无论如何,谢谢你的回答! +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 2016-02-15
    • 2016-10-05
    • 2012-07-08
    • 2011-08-12
    • 1970-01-01
    相关资源
    最近更新 更多