如何从字符串中删除一些字符

14
我想要从字符串中删除以下所有字符:

">[],-"

目前我正在这样做。但一定有更有效的方法。
newString = myString.replace(">","").replace("[","").replace("]","")....

你可以使用正则表达式,但是那样的话你需要转义特殊字符。你所说的效率是指运行时还是你自己编写代码的效率? - Goran Jovic
担心这个特定问题的“效率”表明过早优化;我非常怀疑这种方法是您的应用程序的瓶颈。请花时间找出您的应用程序真正缓慢并需要优化的地方。 - Bombe
8个回答

17

使用描述您想替换的所有字符的正则表达式,并使用替换与正则表达式匹配的所有内容的方法:

newString = myString.replaceAll("[<>\\[\\],-]", "");

(编辑:我不认为应该转义<>。而且我忘记了要加倍反斜杠,因为它们将被Java编译器和正则表达式引擎分别解析两次。)


如果我想保留换行符怎么办? - Mann

9
你可以使用String类的replaceAll方法。
你可以形成一个由你想要删除的字符组成的字符类。替换字符串将是空字符串""。
但是,你想要删除的字符可能是正则表达式元字符,因此需要转义。你可以像许多答案所示手动转义它们,或者你可以使用Pattern.quote()方法。
String charToDel = ">[],-";
String pat = "[" + Pattern.quote(charToDel) + "]";
String str = "a>b[c]d,e-f";
str = str.replaceAll(pat,"");

See it


4

从性能方面来说更加高效:是的。你无法从字符串中“删除”字符,所以你必须创建一个新的字符串。考虑使用基于 switch/case 的解决方案:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
  switch(s.getCharAt(i)) {
    case '>':
    case '[':
    case ']':
    case ',':
    case '-': break;
    default: sb.append(s.getCharAt(i));
  }
}
s = sb.toString();

代码中有一个错别字:不是 s.getCharAt(i),而是 s.charAt(i)。 - lgu

2
newString = myString.replaceAll("[>\\[\\],-]", "");

反斜杠用于转义'[',因为第一个参数实际上是一个正则表达式。


嗯...你需要将这些字符放在一个字符类([])中,因为你要查找它们中的任何一个,而不是所有连续的字符序列... - Karl Knechtel
不要以为那会起作用。那只会匹配符号按照那个顺序紧密排列的情况。 - jzd
仍然无法正常工作。我的字符串中包含所有这些字符。 - 124697

2
使用 replace / replaceAll 方法每次都会编译一个新 Pattern。因此,如果您需要多次执行此操作,强烈建议循环遍历字符或创建一个可重复使用的正则表达式。

请不要自己循环遍历字符;如果这很重要,请“创建正则表达式”(在Java中创建一个新的Pattern实例)。请参阅Java文档中的java.util.regex.Pattern,该文档还提供了Java正则表达式引擎支持的基本概述。 - Karl Knechtel

1
newString = myString.replaceAll("[>\\[\\],-]", "");

有点能用,但它删除的比我想要的多得多。它几乎删除了所有数据。 - 124697
@user521180:稍微编辑了一下,请再试一次。如果还不符合您的要求,能否给我们提供一些数据样本? - darioo

0

你可以循环遍历每个字符,将它们逐一添加到 StringBuilder() 中,除非它们与你要删除的字符之一匹配。

但我不确定这样会更快。


0

使用正则表达式;字符串的replaceAll方法将正则表达式作为第一个参数,替换文本作为第二个参数;例如

return myString.replaceAll(">|\\[|\\]|,|-";, "");

2
如果您无法提供完整的链接,请将其从问题中删除。您的答案可能被视为垃圾内容。 - RobertS supports Monica Cellio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接