web-dev-qa-db-fra.com

Comment supprimer les caractères de contrôle de la chaîne Java?

J'ai une chaîne provenant de l'interface utilisateur qui peut contenir des caractères de contrôle, et je veux supprimer tous les caractères de contrôle, sauf retours chariot, sauts de ligne et tabulations =.

À l'heure actuelle, je peux trouver deux façons de supprimer tous les caractères de contrôle:

1- en utilisant la goyave:

return CharMatcher.Java_ISO_CONTROL.removeFrom(string);

2- en utilisant l'expression régulière:

return string.replaceAll("\\p{Cntrl}", "");
24
Mahmoud Saleh

Vous pouvez faire quelque chose comme ceci si vous souhaitez supprimer tous les caractères dans une autre catégorie ou contrôler la catégorie uni-code

System.out.println(
    "a\u0000b\u0007c\u008fd".replaceAll("\\p{Cc}", "")
); // abcd

Remarque: Cela supprime en fait (entre autres) le caractère Unicode '\ u008f' de la chaîne, pas la chaîne de forme d'échappement "% 8F".

Courtoisie: lubrifiants polygéniques ( Remplacer les caractères de contrôle Unicode )

23
Nidhish Krishnan

Une option consiste à utiliser une combinaison de CharMatchers:

CharMatcher charsToPreserve = CharMatcher.anyOf("\r\n\t");
CharMatcher allButPreserved = charsToPreserve.negate();
CharMatcher controlCharactersToRemove = CharMatcher.Java_ISO_CONTROL.and(allButPreserved);

Utilisez ensuite removeFrom comme précédemment. Je ne sais pas à quel point c'est efficace, mais c'est au moins simple.


Comme indiqué dans les modifications, Java_ISO_CONTROL Est désormais obsolète en Guava; la méthode javaIsoControl() est préférée.

15
Jon Skeet

Cela semble être une option

    String s = "\u0001\t\r\n".replaceAll("[\\p{Cntrl}&&[^\r\n\t]]", "");
    for (char c : s.toCharArray()) {
        System.out.print((int) c + " ");
    }

imprime 9 13 10 comme vous l'avez dit "sauf les retours chariot, les sauts de ligne et les tabulations".

9
Evgeniy Dorofeev

utilisez ceux-ci

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 removeControlCharFull(String str)
{
    return removeNonPrintable(str).replaceAll("[\\r\\n\\t]", "");
}
3
Ali Bagheri

Dans Java expression régulière, il est possible d'exclure certains caractères dans une classe de caractères. Voici un exemple de programme démontrant quelque chose de similaire:

class test {
    public static void main (String argv[]) {
            String testStr="abcdefABCDEF";
            System.out.println(testStr);
            System.out.println(testStr.replaceAll("[\\p{Lower}&&[^cd]]",""));
    }
}

Il produira cette sortie:

abcdefABCDEF
cdABCDEF
1
Raymond Tau

J'utilise Selenium pour tester des écrans Web. J'utilise les assertions et les égaliseurs Hamcrest pour rechercher dans la source de la page différentes chaînes en fonction de diverses conditions.

String pageSource = browser.getPageSource();
assertThat("Text not found!", pageSource, containsString(text));

Cela fonctionne très bien en utilisant un pilote IE ou Firefox, mais il bombarde lors de l'utilisation de HtmlUnitDriver. Le HtmlUnitDriver formate la source de la page avec des tabulations, des retours chariot et d'autres caractères de contrôle. J'utilise un riff sur la réponse ingénieuse de Nidhish Krishnan ci-dessus. Si j'utilise la solution de Nidish "prête à l'emploi", il me reste des espaces supplémentaires, j'ai donc ajouté une méthode privée nommée filterTextForComparison:

String pageSource = filterTextForComparison(browser.getPageSource());
assertThat("Text not found!", pageSource, 
        containsString(filterTextForComparison(text)));

Et la fonction:

/**
 * Filter out any characters embedded in the text that will interfere with
 * comparing Strings.
 * 
 * @param text
 *            the text to filter.
 * @return the text with any extraneous character removed.
 */
private String filterTextForComparison(String text) {

    String filteredText = text;

    if (filteredText != null) {
        filteredText = filteredText.replaceAll("\\p{Cc}", " ").replaceAll("\\s{2,}", " ");
    }

    return filteredText;
}

Tout d'abord, la méthode remplace les caractères de contrôle par un espace, puis elle remplace plusieurs espaces par un seul. J'ai essayé de tout faire en même temps avec "\ p {Cc} +?" mais il n'a pas attrapé "\ t" devenir "".

1
Steve Gelman