Wie ersetze ich Sonderzeichen in einer Zeichenfolge?

90

Ich habe eine Zeichenfolge mit vielen Sonderzeichen. Ich möchte alle entfernen, aber die alphabetischen Zeichen beibehalten.

Wie kann ich das machen?

Tanu
quelle
Schauen Sie sich diesen Thread an: stackoverflow.com/questions/3438854/…
Cyril Gandon

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:

Sean Patrick Floyd
quelle
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

Dhiral Pandya
quelle
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]", "");
dhuma1981
quelle
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

krishnamurthy
quelle
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.

Mike Clark
quelle
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;
    }
}
Marco Sulla
quelle
0

Sie können grundlegende reguläre Ausdrücke für Zeichenfolgen verwenden, um alle Sonderzeichen zu finden, oder Muster- und Matcher-Klassen verwenden, um benutzerdefinierte Zeichenfolgen zu suchen, zu ändern oder zu löschen. Dieser Link enthält einige einfache und leicht verständliche Beispiele für reguläre Ausdrücke: http://www.vogella.de/articles/JavaRegularExpressions/article.html

Madhu Nandan
quelle
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.

Mundroid
quelle
0

Verwenden Sie für Leerzeichen dieses Muster "[^ az AZ 0-9]"

Muhammad Ahsan
quelle