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.