2015-04-18 4 views
0

Я хотел бы, чтобы удалить любые специальные символы, такие как эти: ☺ ☼Java Предотвращение специальных символов

Я хочу только символы AZ, 0-9 и символы, которые могут быть напечатаны с помощью клавиши переключения и номер, например, ! а также @.

Вот код, который у меня есть сейчас, он возвращает только 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», и символы, которые можно ввести с помощью клавиши смены и числа, например! И @ », способ построить шаблон регулярного выражения, которое соответствует символы, которые не требуется удалить, и использовать 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]#\$%\^&\*\(\)].

Если то, что вы хотите, чтобы удалить все символы, которые не входят в набор ASCII 127 символов, вы можете использовать тот факт, что для этих персонажей, 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

Смежные вопросы