Sostituzione di tutti i caratteri non alfanumerici con stringhe vuote


197

Ho provato a usarlo ma non ha funzionato-

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

36
Ragazzi, dimenticate che ci sono alfabeti diversi da quello latino.
Mateva,

2
Ma se si desidera convalidare un nome host, ad esempio, sarebbe bene escludere alfabeti non validi.
Gurnard,

Risposte:


245

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

Nota: rimosso lo spazio poiché in genere non è considerato alfanumerico.


10
Né dovrebbe lo spazio alla fine della classe di caratteri.
Andrew Duffy,

6
Probabilmente è abituato alla programmazione in PHP.
William,

10
@William - è un peccato che PHP stia ottenendo credito per PCRE
Thomas Dignan,

reg exp è ok, basta rimuovere "/" dalla stringa regexp da value.replaceAll ("/ [^ A-Za-z0-9] /", ""); to value.replaceAll ("[^ A-Za-z0-9]", ""); non hai bisogno del "/" all'interno di regexp, penso che tu sia confuso con i modelli javascript
eriknyk

128

Provare

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

o

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

4
Con il trattino basso,return value.replaceAll("\\W", "");
erickson,

Ovviamente. I compilatori sono bravi a individuare quel genere di cose.
Andrew Duffy,

1
Il secondo non risponde alla domanda. Che dire di personaggi come: / \ etc?
WW.

67

Dovresti essere consapevole che [^a-zA-Z]sostituirà i caratteri che non si trovano nella gamma di caratteri AZ / az. Ciò significa che caratteri speciali come é, ßecc. O caratteri cirillici e simili verranno rimossi.

Se non si desidera la sostituzione di questi caratteri, utilizzare invece le classi di caratteri predefinite:

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

PS: \p{Alnum}non ottiene questo effetto, si comporta come [A-Za-z0-9].


11
Grazie mille per questo post - mi è stato molto utile. Inoltre, credo che questa sia la risposta effettiva alla domanda. L'alfabeto latino non è l'unico al mondo!
Mateva,

2
In realtà, la regex dichiarata tratterà "^" come un carattere valido, poiché solo la prima occorrenza di "^" sta negando il significato della selezione. [^\\p{IsAlphabetic}\\p{IsDigit}]funziona bene.
Bogdan Klichuk,

1
@JakubTurcovsky docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html definisce IsAlphabetic e IsDigit come proprietà binarie. Alpha e Digit sono classi di caratteri POSIX (solo US-ASCII). Tranne il flag docs.oracle.com/javase/10/docs/api/java/util/regex/… specificato.
Andre Steingress,

@AndreSteingress Corretto, il motivo {IsDigit}non funziona per me ed {Digit}è che sto provando questo su Android. E Android è UNICODE_CHARACTER_CLASSattivato per impostazione predefinita. Grazie per l'autorizzazione.
Jakub Turcovsky,

Come consentire solo Alpha, Digit ed Emoji?
Robert Goodrick,

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

Questo lascerà intatti gli spazi. Presumo che sia quello che vuoi. Altrimenti, rimuovi lo spazio dalla regex.


21

Puoi anche provare questa regex più semplice:

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

2
Oppure, preservando gli spazi bianchi:str.replaceAll("[^\\p{Alnum}\\s]", "")
Jonik

Or \\p{Alnum}\\p{Space}.
membri del

10

Le espressioni regolari di Java non richiedono di inserire una barra ( /) o qualsiasi altro delimitatore attorno alla regex, al contrario di altre lingue come Perl, per esempio.


8

Ho creato questo metodo per creare nomi di file:

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
Questa è piuttosto forza bruta. Regex è la strada da percorrere con la situazione del PO.
Michael Peterson,

1
Hai ragione, regex è meglio. Ma a quel tempo, io e regex non ci andavo bene.
zneo,

Hah, qualcuno va davvero d'accordo con regex? ;)
Michael Peterson,

6

Soluzione:

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

Spiegazione:

[^abc] Quando un punto di inserimento ^appare come primo carattere tra parentesi quadre, annulla il motivo. Questo modello corrisponde a qualsiasi carattere tranne a o b o c.

Guardando la parola chiave come due funzioni:

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

Inoltre per quanto riguarda un modello:

  • 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

Pertanto sostituirà tutto il carattere NON incluso nel modello


3

Se si desidera consentire anche caratteri alfanumerici che non appartengono al set di caratteri ASCII, come ad esempio il tedesco umlaut, è possibile utilizzare la seguente soluzione:

 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("");

Si noti che l'uso del flag UNICODE_CHARACTER_CLASS potrebbe imporre una penalità per le prestazioni (vedere javadoc di questo flag)


1

Metodo semplice:

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

Usando Guava puoi facilmente combinare diversi tipi di criteri. Per la tua soluzione specifica puoi usare:

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

1

CharMatcher di Guava offre una soluzione concisa:

output = CharMatcher.javaLetterOrDigit().retainFrom(input);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.