【问题标题】:practice: removing all string occurrences from another练习:从另一个中删除所有出现的字符串
【发布时间】:2013-09-25 05:52:08
【问题描述】:

我正在做一些初学者的编码练习,我遇到了这个问题:给定两个字符串,base 和 remove,返回一个基本字符串的版本,其中删除字符串的所有实例都已被删除。 (不区分大小写)。

这是我目前所拥有的,但它根本不起作用。

public String withoutString(String base, String remove) {

 for (int i=0; i<base.length()-remove.length(); i++){
  if (base.substring(i, i+remove.length()).equals(remove)){
  base = base.substring(i, base.indexOf("remove")-1) + base.substring(base.indexOf("remove"), base.length()-remove.length());
    }
  }
  return base;
}

我还没有处理区分大小写的部分,以使其对我自己更明显。我也不确定为什么我不能使用 base.replaceAll("remove","");任何帮助表示赞赏。

编辑*:我犯了一个新手错误,replaceAll 仍然有效。此外,我怎么能使用循环和条件来做到这一点?会不会像我以前那样乱七八糟?

【问题讨论】:

标签: java


【解决方案1】:

你可以使用

String result = base.replaceAll(remove,"");

在你尝试使用引号时实际上是在尝试删除字符串"remove"。

要处理不区分大小写的问题,您可以在前面使用正则表达式标志来忽略大小写(?i),这样您就可以调用

String result = base.replaceAll("(?i)" + remove,"");

这确实意味着 String remove,现在是一个正则表达式,因此特殊字符可能会产生不希望的结果。例如,如果您的删除字符串是.,您最终会删除每个字符。如果您不希望它作为正则表达式,请使用

String result =  Pattern.compile(remove, Pattern.LITERAL).matcher(base).replaceAll("")

它还可以包含不区分大小写的标志,因为它们是位掩码,请参阅Pattern 了解更多信息

Pattern.LITERAL | Pattern.CASE_INSENSITIVE

编辑

要使用您的循环,只需执行此循环

for (int i=0; i <= base.length()-remove.length(); i++)
{
    if (base.substring(i, i+remove.length()).equals(remove))
    {  
        base = base.substring(0, i) + base.substring(i + remove.length() , base.length());
        i--;
    }
}

【讨论】:

  • 哇,我不敢相信我错过了。这适用于我遇到的示例问题。此外,我怎么能使用循环和条件来做到这一点?会不会像我以前那样乱七八糟?这个问题被标记为困难,我不认为它打算用这么简单的陈述来完成。也感谢您的回复。
  • @xheyhenry 查看我的回答。您搞砸了值引用和固定字符串的使用。
  • 糟糕,粘贴错误。您应该使用不区分大小写的文字模式和匹配器对象进行编译。如果 。字符串被删除了吗?
  • @hexafraction 是的,你应该这样做,我在帖子中发表评论的目的是提出这个问题。
  • @JavaDevil 你在哪里提到匹配模式的文字常量?
【解决方案2】:

indexOf("remove") 表示,您正在搜索(固定)字符串 remove,而不是名为 remove 的 String 的值 - 这很可能不是您想要做的。这同样适用于您的 replaceAll("remove") 尝试。

删除",以便您使用名为remove 的字符串的值,而不是固定字符串"remove"

例子:

String remove = "test";
System.out.println(remove) // will print: test
System.out.println("remove") // will print: remove

【讨论】:

    【解决方案3】:

    试试这个:

    if(base.indexOf(remove) != -1){
    base.replaceAll(remove,"");
    }
    

    【讨论】:

      【解决方案4】:

      您应该使用(?i) 标志或:

      base = Pattern.compile(remove, Pattern.CASE_INSENSITIVE).matcher(base).replaceAll("");
      

      【讨论】:

      • 您应该使用不区分大小写的文字模式和匹配器对象进行编译。如果. 是要删除的字符串呢?
      • 。是一个特殊字符。你应该写成 \\.使用 replaceAll 和 Pattern 编译。
      • 不,因为 . 来自 String 对象,而不是来自其他代码,所以这不起作用。
      猜你喜欢
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 2021-04-06
      • 2014-08-07
      • 2011-06-02
      • 1970-01-01
      • 2011-12-19
      相关资源
      最近更新 更多