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 ]/", "");
Alex Gomes
la source
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.

Mirek Pluta
la source
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]|_", "");
Andrew Duffy
la source
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].

Andre Steingress
la source
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.

erickson
la source
21

Vous pouvez également essayer cette expression rationnelle plus simple:

 str = str.replaceAll("\\P{Alnum}", "");
saurav
la source
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.

abyx
la source
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();
}
zneo
la source
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

GalloCedrone
la source
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)

casser
la source
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 "";
    }
}
Alberto Cerqueira
la source
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)
Deb
la source
1

CharMatcher de Guava fournit une solution concise:

output = CharMatcher.javaLetterOrDigit().retainFrom(input);
Bunarro
la source