如何从一个字符串中移除无效的字符?

5

我不知道如何在Java中从字符串中删除无效字符。 我试图删除所有不是数字,字母或()[]的字符。 我该怎么做?

谢谢

8个回答

16
String foo = "this is a thing with & in it";
foo = foo.replaceAll("[^A-Za-z0-9()\\[\\]]", "");

Javadocs是你的好朋友。正则表达式也是你的好朋友。

编辑:

话虽如此,这只适用于拉丁字母表;您可以相应调整。如果适用于您的情况,\\w可用于a-zA-Z以表示“单词”字符,虽然它包括_


Java正则表达式的主要参考文献:java.util.regex.Pattern - etech

8

使用Guava,几乎肯定比正则表达式更高效(也更易读):

CharMatcher desired = CharMatcher.JAVA_DIGIT
  .or(CharMatcher.JAVA_LETTER)
  .or(CharMatcher.anyOf("()[]"))
  .precomputed(); // optional, may improve performance, YMMV
return desired.retainFrom(string);

5
不要这么刻薄。它只是一个Java库,而且非常方便实用。 - Louis Wasserman
这不是使用CharMatcher.or()的正确方式,它只接受一个参数。 - Stephan

3

试试这个:

String s = "123abc&^%[]()";
s = s.replaceAll("[^A-Za-z0-9()\\[\\]]", "");
System.out.println(s);

以上代码将删除示例字符串中的字符"&^%",并仅在s中保留"123abc[]()"

3
根据你对“数字”、“字母”等的定义而定。我肯定不希望把Straße改成Strae。我想说这是一个相当“天真”的解决方法,抱歉,应该是“愚蠢”的解决方法 ;) - Voo
只是提醒一下,您不必转义括号。 - Brian Roach

1
public static void main(String[] args) {
    String c = "hjdg$h&jk8^i0ssh6+/?:().,+-#";
    System.out.println(c);
    Pattern pt = Pattern.compile("[^a-zA-Z0-9/?:().,'+/-]");
    Matcher match = pt.matcher(c);
    if (!match.matches()) {
        c = c.replaceAll(pt.pattern(), "");
    }
    System.out.println(c);
}

你应该尝试解释一下你的答案,仅发布一小段代码对于寻求帮助的人来说不是一个好的答案。 - ochs.tobi

0
请使用以下代码:
String s = "Test[]"
s = s.replaceAll("[");
s = s.replaceAll("]");

0

您可以从用户端获取的字符串/URL或任何请求参数中删除特殊字符。

  public static String removeSpecialCharacters(String inputString){
        final String[] metaCharacters = {"../","\\..","\\~","~/","~"};
        String outputString="";
        for (int i = 0 ; i < metaCharacters.length ; i++){
            if(inputString.contains(metaCharacters[i])){
                outputString = inputString.replace(metaCharacters[i],"");
                inputString = outputString;
            }else{
                outputString = inputString;
            }
        }
        return outputString;
   }

0

myString.replaceAll("[^\\w\\[\\]\\(\\)]", "");
replaceAll 方法将正则表达式作为第一个参数并替换所有匹配的字符串。这个正则表达式匹配所有非数字、字母或下划线 (\\w) 和你需要的括号 (\\[\\]\\(\\)) 的字符。


不能使用\w,因为它包括下划线字符 _ - 这是根据问题无效的字符。 - Óscar López
也许他只是忘记下划线了吧? - shift66
@ÓscarLópez - 在我的Java和语言环境中并没有出现这种情况。 - Brian Roach
@BrianRoach 引用文档\w 一个单词字符:[a-zA-Z_0-9] - Óscar López
不好意思,我有点傻了 :-D 下午喝啤酒的时候,我想。 - Brian Roach
它不匹配 () 符号。 - leap123

0

您可以根据ASCII表中字符的顺序指定要保留/删除的字符范围。正则表达式可以使用实际字符或字符十六进制代码:

// Example - remove characters outside of the range of "space to tilde".
// 1) using characters
someString.replaceAll("[^ -~]", "");

// 2) using hex codes for "space" and "tilde"
someString.replaceAll("[^\\u0020-\\u007E]", "");

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