L'Op De Cirkel a généralement raison. Sa suggestion fonctionnera dans la plupart des cas:
myString.replaceAll("\\p{C}", "?");
Mais si myString
peut contenir des points de code non BMP, c'est plus compliqué. \p{C}
contient les points de code de substitution de \p{Cs}
. La méthode de remplacement ci-dessus corrompra les points de code non BMP en remplaçant parfois seulement la moitié de la paire de substitution. Il est possible que ce soit un bogue Java plutôt qu'un comportement prévu.
L'utilisation des autres catégories constituantes est une option:
myString.replaceAll("[\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", "?");
Cependant, les caractères de substitution solitaires ne faisant pas partie d'une paire (chaque caractère de substitution a un point de code attribué) ne seront pas supprimés. Une approche non-regex est le seul moyen que je connaisse pour gérer correctement \p{C}
:
StringBuilder newString = new StringBuilder(myString.length());
for (int offset = 0; offset < myString.length();)
{
int codePoint = myString.codePointAt(offset);
offset += Character.charCount(codePoint);
switch (Character.getType(codePoint))
{
case Character.CONTROL:
case Character.FORMAT:
case Character.PRIVATE_USE:
case Character.SURROGATE:
case Character.UNASSIGNED:
newString.append('?');
break;
default:
newString.append(Character.toChars(codePoint));
break;
}
}