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

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

Andre Steingress
quelle
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.

erickson
quelle
21

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

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

Abyx
quelle
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();
}
zneo
quelle
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

GalloCedrone
quelle
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).

einrasten
quelle
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 "";
    }
}
Alberto Cerqueira
quelle
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)
Deb
quelle