Ersetzen aller nicht alphanumerischen Zeichen durch leere Zeichenfolgen


197

Ich habe es versucht, aber es hat nicht funktioniert.

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

36
Leute, ihr vergisst, dass es andere Alphabete als das lateinische gibt.
Mateva

2
Wenn Sie beispielsweise einen Hostnamen überprüfen möchten, sollten Sie ungültige Alphabete ausschließen.
Gurnard

Antworten:


245

Verwenden Sie [^A-Za-z0-9].

Hinweis: Der Leerzeichen wurde entfernt, da dies normalerweise nicht als alphanumerisch angesehen wird.


10
Das Leerzeichen am Ende der Zeichenklasse sollte auch nicht sein.
Andrew Duffy

6
Er ist wahrscheinlich daran gewöhnt, in PHP zu programmieren.
William

10
@ William - es ist bedauerlich, dass PHP jetzt Gutschrift für PCRE bekommt
Thomas Dignan

die reg exp ist in Ordnung, entfernen Sie einfach "/" aus der regulären Ausdruckszeichenfolge von value.replaceAll ("/ [^ A-Za-z0-9] /", ""); to value.replaceAll ("[^ A-Za-z0-9]", ""); du brauchst das "/" nicht im regulären Ausdruck, ich denke du hast es mit Javascript-Mustern verwechselt
eriknyk

128

Versuchen

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

oder

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

4
Mit Unterstrichen,return value.replaceAll("\\W", "");
erickson

Natürlich. Compiler sind großartig darin, solche Dinge zu erkennen.
Andrew Duffy

1
Der zweite beantwortet die Frage nicht. Was ist mit Zeichen wie: / \ etc?
WW.

67

Sie sollten sich bewusst sein, dass [^a-zA-Z]Zeichen ersetzt werden, die sich nicht selbst im Zeichenbereich AZ / az befinden. Das bedeutet , dass Sonderzeichen wie é, ßusw. oder kyrillische Zeichen und so wird entfernt.

Wenn das Ersetzen dieser Zeichen nicht gewünscht ist, verwenden Sie stattdessen vordefinierte Zeichenklassen:

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

PS: \p{Alnum}Erreicht diesen Effekt nicht, er verhält sich genauso wie [A-Za-z0-9].


11
Vielen Dank für diesen Beitrag - er war sehr nützlich für mich. Außerdem glaube ich, dass dies die eigentliche Antwort auf die Frage ist. Das lateinische Alphabet ist nicht das einzige auf der Welt!
Mateva

2
Tatsächlich behandelt der angegebene reguläre Ausdruck "^" als gültiges Zeichen, da nur das erste Auftreten von "^" die Bedeutung der Auswahl negiert. [^\\p{IsAlphabetic}\\p{IsDigit}]funktioniert gut.
Bogdan Klichuk

1
@JakubTurcovsky docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html definiert IsAlphabetic und IsDigit als binäre Eigenschaften. Alpha und Digit sind POSIX-Zeichenklassen (nur US-ASCII). Außer das Flag docs.oracle.com/javase/10/docs/api/java/util/regex/… ist angegeben.
Andre Steingress

@AndreSteingress Richtig, der Grund {IsDigit}funktioniert bei mir nicht und {Digit}ist, dass ich dies auf Android versuche. Und Android ist UNICODE_CHARACTER_CLASSstandardmäßig aktiviert. Vielen Dank für die Freigabe.
Jakub Turcovsky

Wie kann man nur Alpha, Digit und Emoji zulassen?
Robert Goodrick

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

Dies wird verlassen Räume intakt. Ich nehme an, das ist was du willst. Entfernen Sie andernfalls das Leerzeichen aus dem regulären Ausdruck.


21

Sie können auch diesen einfacheren regulären Ausdruck ausprobieren:

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

2
Oder, Leerzeichen erhalten:str.replaceAll("[^\\p{Alnum}\\s]", "")
Jonik

Oder \\p{Alnum}\\p{Space}.
Membersound

10

Bei den regulären Ausdrücken von Java müssen Sie /im Gegensatz zu anderen Sprachen wie beispielsweise Perl keinen Schrägstrich ( ) oder ein anderes Trennzeichen um den regulären Ausdruck setzen .


8

Ich habe diese Methode zum Erstellen von Dateinamen erstellt:

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
Das ist ziemlich brutal. Regex ist der richtige Weg für die Situation des OP.
Michael Peterson

1
Du hast recht, Regex ist besser. Aber zu der Zeit, Regex und ich, kam ich nicht gut miteinander aus.
Zneo

Hah, versteht sich jemand wirklich so gut mit Regex? ;)
Michael Peterson

6

Lösung:

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

Erläuterung:

[^abc] Wenn ein Caret ^als erstes Zeichen in eckigen Klammern angezeigt wird, wird das Muster negiert. Dieses Muster entspricht jedem Zeichen außer a oder b oder c.

Betrachten Sie das Schlüsselwort als zwei Funktionen:

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

Darüber hinaus in Bezug auf ein Muster:

  • 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

Daher werden alle Zeichen ersetzt, die NICHT im Muster enthalten sind


3

Wenn Sie auch alphanumerische Zeichen zulassen möchten, die nicht zum ASCII-Zeichensatz gehören, wie z. B. deutsche Umlaute, können Sie die folgende Lösung in Betracht ziehen:

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

Bitte beachten Sie, dass die Verwendung des UNICODE_CHARACTER_CLASS-Flags die Leistungseinbußen beeinträchtigen kann (siehe Javadoc dieses Flags).


1

Einfache Methode:

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

Mit Guava können Sie problemlos verschiedene Arten von Kriterien kombinieren. Für Ihre spezifische Lösung können Sie Folgendes verwenden:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.