从字符串中删除某些字符

时间:2011-03-21 03:09:58

标签: java

我正在考虑使用String.replaceAll()删除字符串中的某些字符。目前还不清楚哪些字符将被删除(即我想删除哪些字符),但我认为任何字符都是有效的(如[a-zA-Z]$%!之类的东西等)。

我遇到了http://www.java-tips.org/java-se-tips/java.lang/strip-certain-characters-from-a-string.html,但肯定有一种比迭代每个角色更好的方式......

对此有何想法?

由于

实施例

为了澄清,我会有不同长度的字符串。我想从中删除字符,确切的在运行时确定,然后返回结果字符串。

采用上面的段落并允许我删除“,.”,我会返回字符串:

  

只是为了澄清我会有一些字符串   不同的长度,我想剥离   从中得到的字符   在运行时确定并返回   结果字符串

顺便说一句,我知道replaceAll()使用正则表达式,所以如果我想删除字符“$,。”,我也需要逃避它们,对吗?

8 个答案:

答案 0 :(得分:17)

您可能希望首先指定要保留的字符,尝试类似:

"mystring".replaceAll("[^a-zA-Z]", "")​

只保留信件。

答案 1 :(得分:13)

我猜,以下代码可以帮助您。

    String input = "Just to clarify, I will have strings of varying "
      + "lengths. I want to strip characters from it, the exact "
      + "ones to be determined at runtime, and return the "
      + "resulting string.";
    String regx = ",.";
    char[] ca = regx.toCharArray();
    for (char c : ca) {
        input = input.replace(""+c, "");
    }
    System.out.println(input);

答案 2 :(得分:11)

这是正则表达式可能不是一个好主意的情况之一。你最终会编写更多特殊代码来解决正则表达式,而不是只采用简单的方法并迭代字符。您还可能会忽略某些可能在以后出现错误的案例。

如果你担心性能,正则表达式实际上要慢得多。如果您查看代码或配置文件的使用,正则表达式必须创建一个模式来解析/编译,运行匹配的逻辑,然后应用您的替换。所有这些都会产生很多对象,如果你经常迭代这些对象会很昂贵。

我会在那个链接上实现你所发现的东西。您可以节省不必要的String分配,因为它构建结果时没有任何额外的复杂性:

public static String stripChars(String input, String strip) {
    StringBuilder result = new StringBuilder();
    for (char c : input.toCharArray()) {
        if (strip.indexOf(c) == -1) {
            result.append(c);
        }
    }
    return result.toString();
}

答案 3 :(得分:10)

如果您已经在使用该库,Guava可以使用CharMatcher

轻松实现
String charsToRemove = "%^#";
String stringToFilter = "I have 20% of my assets in #2 pencils! :^)";

String filtered = CharMatcher.anyOf(charsToRemove).removeFrom(stringToFilter);

答案 4 :(得分:2)

我认为这可以通过使用正则表达式来完成。

首先,我们知道[a-zA-Z]$%!对字符串中的字符有效。因此我们使用regx "[^a-zA-Z0-9$%!]"去除其他无效字符。 查看http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html以获取JAVA模式的详细信息。

接下来,我们可以使用mystring.replaceAll(String regex, String replacement)

P.S。 RefexPlanet在线正则表达式测试页面

答案 5 :(得分:1)

我认为您正在寻找这样的代码来解决您的问题 without any looping

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StripChars {
    public static void main(String[] args) {
    // prints: Just to clarify I will have strings of varying lengths   
    System.out.println(
     replace("Just to clarify, I will have strings of varying lengths.",
               ",."));

    // prints: Solution to my problem on Stackoverflow will cost me 0
    System.out.println(
     replace("Solution to my problem on stackoverflow will cost me $0.", 
               ".$"));      
    }

    static String replace(String line, String charsToBeReplaced) {
        Pattern p = Pattern.compile("(.{1})");
        Matcher m = p.matcher(charsToBeReplaced);
        return line.replaceAll(m.replaceAll("\\\\$1\\|"), "");
    }
}

在输入替换方法中处理特殊的正则表达式字符(元字符)首先在每个字符和|之前放置\(反斜杠) (管道)输入中的每个字符后面。因此,",."的输入将变为"\\,|\\.|"

一旦完成,那么替换非常简单:对于每个匹配的char,将其替换为空白。

此解决方案中未使用,但此处是检测Java中 ANY 特殊正则表达式字符的存在的模式:

Pattern metachars = Pattern.compile(
   "^.*?(\\(|\\[|\\{|\\^|\\-|\\$|\\||\\]|\\}|\\)|\\?|\\*|\\+|\\.).*?$");

答案 6 :(得分:1)

Guava方法很有意思,但我不确定为什么他们使用“spread”变量。由于它们使用它,因此每个班次都需要减法操作。我对几个版本(包括一个简单的手动编码移位器)进行了基准测试,你可以在这里找到这篇文章:

http://thushw.blogspot.com/2013/06/java-remove-specified-characters-from.html

答案 7 :(得分:0)

我猜您链接上的示例代码足够好,您可以添加其他有效字符。但您可以使用正则表达式最小化代码。看看阿卜杜拉的代码,或者查看更多link1link2link3