Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java阻止特殊字符_Java_Character - Fatal编程技术网

Java阻止特殊字符

Java阻止特殊字符,java,character,Java,Character,我想删除以下特殊字符:☺ ☼ 我只需要字符A-Z、0-9和可以使用shift键和数字键入的符号,例如!以及" 这是我现在拥有的代码,它只在字符串包含来自另一种语言的字符时返回true public static boolean hasSymbols(String v) { boolean b = false; byte bytearray [] = v.getBytes(); CharsetDecoder d = Charset.forName("US-ASCII")

我想删除以下特殊字符:☺ ☼

我只需要字符A-Z、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;
}

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

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

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

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, "");
}
上述模式称为非正常字符模式将非单词字符与
\W
匹配,除Shift+[0-9]字符外的所有字符与
[^!@\$%\^&*\(\)]匹配。

如果要删除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();
}

您是要求代码删除字符,还是询问函数是否是检测字符的好方法?@galdre否,该问题要求删除所有“非字母数字字符”,而OP要求删除“特殊字符”(如果根据代码判断为非ascii)。是,但是它非常接近——这两个问题之间没有实质性的区别,只是表面上。@galdre不是真的:像
?!/虽然不是字母数字,但不应删除。也许您可以使用一些简单的正则表达式匹配?这两种方法都不起作用。对于您给出的第一个方法,如果字符串中只有一个字符,则对于任何字符都返回true。在第二种方法中,它的效果稍微好一点,但是除了字母或数字以外的任何东西都返回-1。它给出的数字也与任何在线ASCII表不匹配。对于1,它返回1,以此类推。