删除Java中的指定子字符串

时间:2016-08-13 23:43:30

标签: java string substring

这实际上是来自 CodingBat 的练习。问题的定义如下:

  

给定一个字符串,如果字符串" del"出现在索引1处,返回一个字符串,其中" del"已被删除。否则,返回字符串不变。

     
      
  • delDel(" adelbc")→" abc"
  •   
  • delDel(" adelHello")→" aHello"
  •   
  • delDel(" adedbc")→" adedbc"
  •   

我的工作如下:

public String delDel(String str) {
  String del = "del";

  if (str.indexOf(del, 1) == 1){
    str.replaceFirst("del", null);
  }

  return str;
}

大多数情况都适用,但我在&#34; adelbc &#34;,&#34; adelHello <中得到 NullPointerException /强>&#34;和&#34; adel &#34;案例。我不太明白为什么。

1 个答案:

答案 0 :(得分:4)

如果仔细查看OpenJDK源代码,您会注意到replaceFirst代理工作到regexp函数,包括用于替换步骤的函数;

public String replaceFirst(String replacement) {
    if (replacement == null)
        throw new NullPointerException("replacement");
    reset();
    if (!find())
        return text.toString();
    StringBuffer sb = new StringBuffer();
    appendReplacement(sb, replacement);
    appendTail(sb);
    return sb.toString();
}

请注意,替换不能为null。我假设在JRE的其他实现中行为将类似。请使用"" - 空字符串 - 而不是null作为替换。

同样如cricket_007的评论中所述,您希望保存replaceFirst的结果以便返回,因为原始字符串不会受到影响(Java中的所有字符串都是不可变的)。最后一段代码:

public String delDel(String str) {
  String del = "del";

  if (str.indexOf(del, 1) == 1){
    return str.replaceFirst("del", "");
  }

  return str;
}