Wie ersetze ich Sonderzeichen in einer Zeichenfolge?


Antworten:


186

Das hängt davon ab, was du meinst. Wenn Sie sie nur entfernen möchten, gehen Sie folgendermaßen vor:
(Update: Anscheinend möchten Sie auch die Ziffern behalten, verwenden Sie in diesem Fall die zweiten Zeilen.)

String alphaOnly = input.replaceAll("[^a-zA-Z]+","");
String alphaAndDigits = input.replaceAll("[^a-zA-Z0-9]+","");

oder das Äquivalent:

String alphaOnly = input.replaceAll("[^\\p{Alpha}]+","");
String alphaAndDigits = input.replaceAll("[^\\p{Alpha}\\p{Digit}]+","");

(All dies kann erheblich verbessert werden, indem das Regex-Muster vorkompiliert und in einer Konstanten gespeichert wird.)

Oder mit Guave :

private static final CharMatcher ALNUM =
  CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z'))
  .or(CharMatcher.inRange('0', '9')).precomputed();
// ...
String alphaAndDigits = ALNUM.retainFrom(input);

Wenn Sie jedoch Zeichen mit Akzent in etwas Sinnvolles verwandeln möchten, das immer noch ASCII ist, schauen Sie sich diese Fragen an:


Wenn ich diese Funktion benutze, werden auch alle Zahlen entfernt. Aber ich möchte nicht, dass Zahlen entfernt werden. Ich möchte nur Sonderzeichen entfernen. Bitte schlagen Sie etwas vor.
— Tanu

Nun, Sie sagten, Sie wollten nur das Alphabet. Aber ich werde meine Antwort in einer Minute aktualisieren
— Sean Patrick Floyd

Ich möchte einen Concat-String erstellen, aber mit einer Bedingung wie 1.Wenn es nur ein Ergebnis gibt, ist kein Concat erforderlich. 2.Wenn das Ergebnis mehr als 1 als der Concat-String im folgenden Formularbeispiel ist: Stack + Over + Flow
— Tanu

2
@ Tanu das ist eine andere Frage. Machen Sie es neu
— Pekka

Was ist, wenn ich nicht möchte, dass Leerzeichen entfernt werden? oder sagen alle Leerzeichen wie Tabulatoren, Zeilenumbrüche als nur ein Leerzeichen reduziert?
— Verdammt

74

Ich benutze das.

s = s.replaceAll("\\W", ""); 

Es ersetzt alle Sonderzeichen aus der Zeichenfolge.

Hier

\ w: Ein Wortzeichen, kurz für [a-zA-Z_0-9]

\ W: Ein Nicht-Wort-Zeichen


Funktioniert nicht für <script> alert ('XSS Attack') </ script>. Wie entferne ich '<', '>', '\' Zeichen?
— Manoj

11

Mit der folgenden Methode können Sie alphanumerische Zeichen beibehalten.

replaceAll("[^a-zA-Z0-9]", "");

Und wenn Sie nur alphabetische Zeichen behalten möchten, verwenden Sie diese

replaceAll("[^a-zA-Z]", "");

5
Für den WeltraumreplaceAll("[^a-zA-Z0-9 ]", "");
— Qamar

5

Ersetzen Sie Sonderzeichen durch

replaceAll("\\your special character","new character");

Beispiel: um das gesamte Auftreten von * durch Leerzeichen zu ersetzen

replaceAll("\\*","");

* Diese Anweisung kann jeweils nur einen Sonderzeichentyp ersetzen


Auf jeden Fall das, wonach ich gesucht habe, als ich den Fragentitel "Wie ersetze ich Sonderzeichen in einer Zeichenfolge?" Sah. Vielen Dank!
— Mr.Drew

2
string Output = Regex.Replace(Input, @"([ a-zA-Z0-9&, _]|^\s)", "");

Hier werden alle Sonderzeichen außer Leerzeichen, Komma und kaufmännisches Und ersetzt. Sie können auch Leerzeichen, Komma und kaufmännisches Und durch den folgenden regulären Ausdruck weglassen.

string Output = Regex.Replace(Input, @"([ a-zA-Z0-9_]|^\s)", "");

Wobei Eingabe die Zeichenfolge ist, die wir benötigen, um die Zeichen zu ersetzen.


2

Nach dem Beispiel der Antwort von Andrzej Doyle denke ich, dass die bessere Lösung darin besteht, Folgendes zu verwenden org.apache.commons.lang3.StringUtils.stripAccents():

package bla.bla.utility;

import org.apache.commons.lang3.StringUtils;

public class UriUtility {
    public static String normalizeUri(String s) {
        String r = StringUtils.stripAccents(s);
        r = r.replace(" ", "_");
        r = r.replaceAll("[^\\.A-Za-z0-9_]", "");
        return r;
    }
}


0

Sie können Unicode für dieses Junk-Zeichen aus dem Characterermap-Tool im Fenster-PC abrufen und \ u zB \ u00a9 als Copyright-Symbol hinzufügen. Jetzt können Sie diese Zeichenfolge mit diesem bestimmten Junk-Zeichen verwenden. Entfernen Sie kein Junk-Zeichen, sondern ersetzen Sie es durch den richtigen Unicode.


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.