2015-04-18 52 views
0

我想删除这样的任何特殊字符:☺☼的Java避免特殊字符

我只想字符AZ,0-9和符号可以使用Shift键和一个数字来输入,如!和@。

这里是我现在的代码,它只返回true,如果字符串包含来自其他语言的字符。

public static boolean hasSymbols(String v) { 
    boolean b = false; 
    byte bytearray [] = v.getBytes(); 
    CharsetDecoder d = Charset.forName("US-ASCII").newDecoder(); 
    try { 
     CharBuffer r = d.decode(ByteBuffer.wrap(bytearray)); 
     r.toString(); 
    } catch (Exception e) { 
     return true; 
    } 
    return b; 
} 
+0

你是要求代码去除角色,还是要问你的功能是否是检测它们的好方法? –

+0

@galdre nope,该问题要求删除所有“非字母数字字符”,而在这里OP要求删除“特殊字符”(非ASCII码,如果由代码判断)。 – alfasin

+0

是的,但它非常接近 - 两个问题之间没有什么实质性差异,只是表面上的差异。 – galdre

回答

0

有几种方法可以做到这一点,具体取决于你想要做什么。

如果(如问题所述)您想删除所有不是“AZ,0-9,以及可以使用shift键和一个数字键入的符号,如!和@”的所有字符,则最好方法是构建一个你不想删除字符相匹配的正则表达式模式,并使用String.matches(String)String.replaceAll(String, String)方法:

private static final String NON_NORMAL_CHARACTERS_PATTERN = "\\W|[^[email protected]#\\$%\\^&\\*\\(\\)]"; 

public static boolean hasSymbols(String string) { 
    return string.matches(NON_NORMAL_CHARACTERS_PATTERN); 
} 

public static String removeSymbols(String string) { 
    return string.replaceAll(NON_NORMAL_CHARACTERS_PATTERN, ""); 
} 

以上称为NON_NORMAL_CHARACTERS_PATTERN匹配非单词字符\W,一切模式除了Shift + [0-9]字符与[^[email protected]#\$%\^&\*\(\)]

如果你想要的是去除不在127的ASCII字符集的所有字符,你可以利用一个事实,即这些字符,Character.getNumericValue(char)将始终小于或等于127:

public static boolean isNonASCII(char character) { 
    return Character.getNumericValue(character) > 127; 
} 

public static boolean hasNonASCII(String string) { 
    for (char currentChar : string.toCharArray()) { 
     if (isNonASCII(currentChar)) { 
      return false; 
     } 
    } 

    return true; 
} 

public static String removeNonASCII(String string) { 
    StringBuilder stringBuilder = new StringBuilder(); 

    for (char currentChar : string.toCharArray()) { 
     if (!isNonASCII(currentChar)) { 
      stringBuilder.append(currentChar); 
     } 
    } 

    return stringBuilder.toString(); 
} 
+0

这些都不起作用。对于第一种方法,如果字符串中只有一个字符,则它将返回true。在第二种方法中,它工作得更好一些,但字母或数字以外的任何内容都会返回-1。它给出的数字也与在线找到的任何ASCII表不匹配。对于1,它返回1等。 – user3566858