Remplacement de tous les caractères non alphanumériques par des chaînes vides


197

J'ai essayé d'utiliser ça mais je n'ai pas travaillé-

return value.replaceAll("/[^A-Za-z0-9 ]/", "");

36
Les gars, vous oubliez qu'il existe des alphabets autres que le latin.
Mateva

2
Mais si vous voulez valider un nom d'hôte par exemple, ce serait bien d'exclure les alphabets invalides.
Gurnard

Réponses:


245

Utilisez [^A-Za-z0-9].

Remarque: supprimé l'espace car cela n'est généralement pas considéré comme alphanumérique.


10
L'espace à la fin de la classe de caractère ne devrait pas non plus.
Andrew Duffy

6
Il est probablement habitué à la programmation en PHP.
William

10
@William - il est regrettable que PHP obtienne maintenant du crédit pour PCRE
Thomas Dignan

le reg exp est ok, supprimez simplement "/" de la chaîne d'expression régulière de value.replaceAll ("/ [^ A-Za-z0-9] /", ""); à value.replaceAll ("[^ A-Za-z0-9]", ""); vous n'avez pas besoin du "/" à l'intérieur de l'expression rationnelle, je pense que vous l'avez confondu avec les modèles javascript
eriknyk

128

Essayer

return value.replaceAll("[^A-Za-z0-9]", "");

ou

return value.replaceAll("[\\W]|_", "");

4
Avec soulignements,return value.replaceAll("\\W", "");
erickson

Bien sûr. Les compilateurs sont parfaits pour repérer ce genre de chose.
Andrew Duffy

1
Le second ne répond pas à la question. Qu'en est-il des caractères comme: / \ etc?
WW.

67

Vous devez savoir que [^a-zA-Z]remplacera les caractères qui ne sont pas eux-mêmes dans la plage de caractères AZ / az. Cela signifie des caractères spéciaux comme é,ß etc. ou les caractères cyrilliques et ceux-ci seront supprimés.

Si le remplacement de ces caractères n'est pas souhaité, utilisez plutôt des classes de caractères prédéfinies:

 str.replaceAll("[^\\p{IsAlphabetic}\\p{IsDigit}]", "");

PS: \p{Alnum}n'atteint pas cet effet, il agit de la même manière que [A-Za-z0-9].


11
Merci beaucoup pour ce message - il m'a été très utile. De plus, je pense que c'est la vraie réponse à la question. L'alphabet latin n'est pas le seul au monde!
Mateva

2
En fait, l'expression rationnelle indiquée traitera "^" comme un caractère valide, car seule la première occurrence de "^" annule la signification de la sélection. [^\\p{IsAlphabetic}\\p{IsDigit}]fonctionne bien.
Bogdan Klichuk

1
@JakubTurcovsky docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html définit IsAlphabetic et IsDigit comme propriétés binaires. Alpha et Digit sont des classes de caractères POSIX (US-ASCII uniquement). Sauf que l' indicateur docs.oracle.com/javase/10/docs/api/java/util/regex/… est spécifié.
Andre Steingress

@AndreSteingress Correct, la raison {IsDigit}ne fonctionne pas pour moi et {Digit}c'est parce que j'essaye ceci sur Android. Et Android est UNICODE_CHARACTER_CLASSactivé par défaut. Merci pour le dégagement.
Jakub Turcovsky

Comment autoriser uniquement Alpha, Digit et Emoji?
Robert Goodrick

50
return value.replaceAll("[^A-Za-z0-9 ]", "");

Cela laissera les espaces intacts. Je suppose que c'est ce que tu veux. Sinon, supprimez l'espace de l'expression régulière.


21

Vous pouvez également essayer cette expression rationnelle plus simple:

 str = str.replaceAll("\\P{Alnum}", "");

2
Ou, en préservant les espaces:str.replaceAll("[^\\p{Alnum}\\s]", "")
Jonik

Ou \\p{Alnum}\\p{Space}.
membersound

10

Les expressions régulières de Java ne vous obligent pas à mettre une barre oblique ( /) ou tout autre délimiteur autour de l' expression régulière , contrairement à d'autres langages comme Perl, par exemple.


8

J'ai fait cette méthode pour créer des noms de fichiers:

public static String safeChar(String input)
{
    char[] allowed = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_".toCharArray();
    char[] charArray = input.toString().toCharArray();
    StringBuilder result = new StringBuilder();
    for (char c : charArray)
    {
        for (char a : allowed)
        {
            if(c==a) result.append(a);
        }
    }
    return result.toString();
}

5
C'est assez brutal. Regex est la voie à suivre avec la situation du PO.
Michael Peterson

1
Tu as raison, regex c'est mieux. Mais à l'époque, regex et moi je ne m'entendais pas bien.
zneo

Hah, est-ce que quelqu'un s'entend vraiment bien avec les regex? ;)
Michael Peterson

6

Solution:

value.replaceAll("[^A-Za-z0-9]", "")

Explication:

[^abc] Lorsqu'un signe d'insertion ^apparaît comme premier caractère entre crochets, il annule le motif. Ce modèle correspond à n'importe quel caractère sauf a ou b ou c.

En regardant le mot-clé comme deux fonctions:

  • [(Pattern)] = match(Pattern)
  • [^(Pattern)] = notMatch(Pattern)

De plus concernant un motif:

  • A-Z = all characters included from A to Z

  • a-z = all characters included from a to z

  • 0=9 = all characters included from 0 to 9

Par conséquent, il remplacera tous les caractères NON inclus dans le modèle


3

Si vous souhaitez également autoriser les caractères alphanumériques qui n'appartiennent pas au jeu de caractères ascii, comme par exemple les trémas allemands, vous pouvez envisager d'utiliser la solution suivante:

 String value = "your value";

 // this could be placed as a static final constant, so the compiling is only done once
 Pattern pattern = Pattern.compile("[^\\w]", Pattern.UNICODE_CHARACTER_CLASS);

 value = pattern.matcher(value).replaceAll("");

Veuillez noter que l'utilisation de l'indicateur UNICODE_CHARACTER_CLASS pourrait avoir une incidence sur la pénalité de performance (voir javadoc de cet indicateur)


1

Méthode simple:

public boolean isBlank(String value) {
    return (value == null || value.equals("") || value.equals("null") || value.trim().equals(""));
}

public String normalizeOnlyLettersNumbers(String str) {
    if (!isBlank(str)) {
        return str.replaceAll("[^\\p{L}\\p{Nd}]+", "");
    } else {
        return "";
    }
}


1

En utilisant la goyave, vous pouvez facilement combiner différents types de critères. Pour votre solution spécifique, vous pouvez utiliser:

value = CharMatcher.inRange('0', '9')
        .or(CharMatcher.inRange('a', 'z')
        .or(CharMatcher.inRange('A', 'Z'))).retainFrom(value)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.