Java阻止特殊字符
我想删除以下特殊字符:☺ ☼ 我只需要字符A-Z、0-9和可以使用shift键和数字键入的符号,例如!以及" 这是我现在拥有的代码,它只在字符串包含来自另一种语言的字符时返回trueJava阻止特殊字符,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")
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,以此类推。