O seguinte substituirá os caracteres de controle ASCII (abreviação de [\x00-\x1F\x7F]
):
my_string.replaceAll("\\p{Cntrl}", "?");
O seguinte substituirá todos os caracteres ASCII não imprimíveis (abreviação de [\p{Graph}\x20]
), incluindo caracteres acentuados:
my_string.replaceAll("[^\\p{Print}]", "?");
No entanto, nenhum dos dois funciona para strings Unicode. Alguém tem uma boa maneira de remover caracteres não imprimíveis de uma string Unicode?
Respostas:
my_string.replaceAll("\\p{C}", "?");
Veja mais sobre Unicode regex .
java.util.regexPattern
/ osString.replaceAll
apóia.fonte
char c = 0xFFFA; String.valueOf(c).replaceAll("\\p{C}", "?");
também no javadoc para aparência de padrão na seção de suporte a Unicode , diz que suporta as categoriass.replaceAll("[\\p{C}\\p{Z}]", "")
fará o encantoreplaceAll("[^\\u0000-\\uFFFF]", "")
mas não tive sucessoOp De Cirkel está quase certo. Sua sugestão funcionará na maioria dos casos:
Mas se
myString
pode conter pontos de código não BMP, então é mais complicado.\p{C}
contém os pontos de código substitutos de\p{Cs}
. O método de substituição acima corromperá os pontos de código não BMP, às vezes substituindo apenas metade do par substituto. É possível que seja um bug do Java em vez do comportamento pretendido.Usar as outras categorias constituintes é uma opção:
myString.replaceAll("[\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", "?");
No entanto, personagens substitutos solitários que não fazem parte de um par (cada personagem substituto tem um ponto de código atribuído) não serão removidos. Uma abordagem não regex é a única maneira que conheço para lidar adequadamente com
\p{C}
:StringBuilder newString = new StringBuilder(myString.length()); for (int offset = 0; offset < myString.length();) { int codePoint = myString.codePointAt(offset); offset += Character.charCount(codePoint); // Replace invisible control characters and unused code points switch (Character.getType(codePoint)) { case Character.CONTROL: // \p{Cc} case Character.FORMAT: // \p{Cf} case Character.PRIVATE_USE: // \p{Co} case Character.SURROGATE: // \p{Cs} case Character.UNASSIGNED: // \p{Cn} newString.append('?'); break; default: newString.append(Character.toChars(codePoint)); break; } }
fonte
Você pode estar interessado nas categorias Unicode "Outro, Controle" e possivelmente "Outro, Formato" (infelizmente o último parece conter caracteres não imprimíveis e imprimíveis).
Em expressões regulares Java, você pode verificá-las usando
\p{Cc}
e\p{Cf}
respectivamente.fonte
métodos em golpe para seu objetivo
public static String removeNonAscii(String str) { return str.replaceAll("[^\\x00-\\x7F]", ""); } public static String removeNonPrintable(String str) // All Control Char { return str.replaceAll("[\\p{C}]", ""); } public static String removeSomeControlChar(String str) // Some Control Char { return str.replaceAll("[\\p{Cntrl}\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", ""); } public static String removeFullControlChar(String str) { return removeNonPrintable(str).replaceAll("[\\r\\n\\t]", ""); }
fonte
Usei esta função simples para isso:
private static Pattern pattern = Pattern.compile("[^ -~]"); private static String cleanTheText(String text) { Matcher matcher = pattern.matcher(text); if ( matcher.find() ) { text = text.replace(matcher.group(0), ""); } return text; }
Espero que isso seja útil.
fonte
Com base nas respostas de Op De Cirkel e noackjr , o seguinte é o que eu faço para limpeza geral de strings: 1. aparando espaços em branco iniciais ou finais, 2. dos2unix, 3. mac2unix, 4. removendo todos os "caracteres Unicode invisíveis", exceto espaços em branco:
myString.trim.replaceAll("\r\n", "\n").replaceAll("\r", "\n").replaceAll("[\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}&&[^\\s]]", "")
Testado com Scala REPL.
fonte
Eu proponho remover os caracteres não imprimíveis como abaixo, em vez de substituí-los
private String removeNonBMPCharacters(final String input) { StringBuilder strBuilder = new StringBuilder(); input.codePoints().forEach((i) -> { if (Character.isSupplementaryCodePoint(i)) { strBuilder.append("?"); } else { strBuilder.append(Character.toChars(i)); } }); return strBuilder.toString(); }
fonte
Reestruturei o código para os números de telefone +9 (987) 124124 Extrai dígitos de uma string em Java
public static String stripNonDigitsV2( CharSequence input ) { if (input == null) return null; if ( input.length() == 0 ) return ""; char[] result = new char[input.length()]; int cursor = 0; CharBuffer buffer = CharBuffer.wrap( input ); int i=0; while ( i< buffer.length() ) { //buffer.hasRemaining() char chr = buffer.get(i); if (chr=='u'){ i=i+5; chr=buffer.get(i); } if ( chr > 39 && chr < 58 ) result[cursor++] = chr; i=i+1; } return new String( result, 0, cursor ); }
fonte