Wie entferne ich Sonderzeichen aus einer Zeichenfolge?

89

Ich möchte Sonderzeichen entfernen wie:

- + ^ . : ,

aus einem String mit Java.

Sameek Mishra
quelle
Sie wissen anscheinend bereits, was eine Regex davon abhängt, wie Sie Ihre Frage markiert haben. Haben Sie versucht, die Dokumentation für die StringKlasse zu lesen ? Achten Sie insbesondere auf das Wort "Regex". Es gibt ein paar Methoden, und ein bisschen Nachdenken sollte Ihnen sagen, wie Sie vorgehen sollen ... :)
Karl Knechtel
3
Der Ausdruck "Sonderzeichen" wird so häufig verwendet, dass er fast völlig bedeutungslos ist. Wenn Sie damit meinen: "Ich habe diese Liste bestimmter Zeichen, die ich entfernen möchte", tun Sie, was Thomas vorschlägt, und bilden Sie Ihr Muster mit einer Regex-Zeichenklasse und replaceAllentfernen Sie diese. Wenn Sie mehr esoterische Anforderungen haben, bearbeiten Sie die Frage. :)
Ray Toal
1
das sind keine Sonderzeichen ... das sind: äâêíìéè, da es sich nicht um Ihre üblichen 1-Byte-Zeichentypen wie - + ^ handelt ... wie Ray sagte, machen Sie entweder ein replaceAllfür sie oder analysieren Sie weiter Fügen Sie der Zeichenfolge die Zeichen hinzu, die nicht die Zeichen sind, die Sie herausnehmen möchten, und führen Sie am Ende einfach ein + = für eine Zeichenfolge aus, die Sie zurückgeben möchten.
Gonçalo Vieira
deleteChars.apply( fromString, "-+^.:," );- finden Sie deleteChars hier
Kaplan

Antworten:

253

Das hängt davon ab, was Sie als Sonderzeichen definieren. Versuchen Sie jedoch Folgendes replaceAll(...):

String result = yourString.replaceAll("[-+.^:,]","");

Beachten Sie, dass das ^Zeichen nicht das erste in der Liste sein darf, da Sie es dann entweder maskieren müssten oder "alle außer diesen Zeichen" bedeuten würden.

Noch ein Hinweis: Das -Zeichen muss das erste oder letzte in der Liste sein, sonst müssten Sie ihm entkommen oder es würde einen Bereich definieren (z. B. :-,würde "alle Zeichen im Bereich :bis " bedeuten ,).

Also, um Konsistenz zu halten und nicht auf Zeichenpositionierung abhängen, können Sie alle diese Zeichen zu entkommen , die eine besondere Bedeutung in regulären Ausdrücken hat (die folgende Liste nicht vollständig ist, so bewusst sein , andere Zeichen wie (, {, $ etc.) ::

String result = yourString.replaceAll("[\\-\\+\\.\\^:,]","");


Wenn Sie alle Satzzeichen und Symbole entfernen möchten, versuchen Sie diesen regulären Ausdruck: \p{P}\p{S}( Beachten Sie , dass Sie in Java-Zeichenfolgen Schrägstriche vermeiden müssen :) "\\p{P}\\p{S}".

Ein dritter Weg könnte so etwas sein, wenn Sie genau definieren können, was in Ihrer Zeichenfolge verbleiben soll:

String  result = yourString.replaceAll("[^\\w\\s]","");

Dies bedeutet: Ersetzen Sie alles, was kein Wortzeichen (az auf jeden Fall 0-9 oder _) oder Leerzeichen ist.

Bearbeiten: Bitte beachten Sie, dass es einige andere Muster gibt, die sich als hilfreich erweisen könnten. Ich kann sie jedoch nicht alle erklären. Schauen Sie sich daher den Referenzabschnitt von regulär-expressions.info an .

Hier ist eine weniger restriktive Alternative zum Ansatz "Zulässige Zeichen definieren", wie von Ray vorgeschlagen:

String  result = yourString.replaceAll("[^\\p{L}\\p{Z}]","");

Die Regex entspricht allem, was kein Buchstabe in einer Sprache und kein Trennzeichen ist (Leerzeichen, Zeilenumbruch usw.). Beachten Sie, dass Sie nicht verwenden können [\P{L}\P{Z}](Großbuchstabe P bedeutet, dass diese Eigenschaft nicht vorhanden ist), da dies "alles bedeutet, was kein Buchstabe oder kein Leerzeichen ist", was fast mit allem übereinstimmt, da Buchstaben keine Leerzeichen sind und umgekehrt.

Zusätzliche Informationen zu Unicode

Einige Unicode-Zeichen scheinen Probleme zu verursachen, da sie auf unterschiedliche Weise codiert werden können (als einzelner Codepunkt oder als Kombination von Codepunkten). Weitere Informationen finden Sie unter reguläre-expressions.info .

Thomas
quelle
+1 für die beste Allzwecklösung. Da Sie einige Variationen auflisten, wenn keine Details aus dem OP vorliegen, können Sie auch Muster wie[\P{L}]
Ray Toal
Beachten Sie auch, dass das -Zeichen das erste oder letzte in der Liste sein muss oder dass es maskiert werden muss.
Kapex
[^\\p{L}\\p{Z}]scheint auch deutsche Umlaute (ä, ö, ü) zu eliminieren (zumindest für mich: /), so dass "Der reguläre Ausdruck passt zu allem, was in keiner Sprache ein Buchstabe ist" nicht 100% korrekt zu sein scheint
Peter
@ Peter beseitigt diese Zeichen in meinen Tests nicht. In Ihrem Fall liegt möglicherweise ein anderes Problem vor, z. B. eine andere Codierung des Texts. Ich werde einen Link zu weiteren Informationen hinzufügen.
Thomas
1
@ Thomas String result = yourString.replaceAll("[^\w\s]","");macht FehlerInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Visruth
38

Dadurch werden alle Zeichen außer alphanumerisch ersetzt

replaceAll("[^A-Za-z0-9]","");
Stephen
quelle
Dadurch werden auch arabische Zeichen entfernt.
S0haib Nasir
1
Dies ist die beste Antwort.
Marius Razvan Varvarei
18

Wie hier beschrieben http://developer.android.com/reference/java/util/regex/Pattern.html

Muster sind regulierte Ausdrücke. In vielen Fällen Bequemlichkeit Methoden wie String.matches, String.replaceAllund String.splitwird bevorzugt sein, aber wenn Sie eine Menge Arbeit mit dem gleichen regulären Ausdruck tun müssen, kann es effizienter sein , es einmal zu kompilieren und wiederverwenden. Die Pattern-Klasse und ihr Begleiter Matcher bieten außerdem mehr Funktionen als die geringe Menge, die String verfügbar macht.

public class RegularExpressionTest {

public static void main(String[] args) {
    System.out.println("String is = "+getOnlyStrings("!&(*^*(^(+one(&(^()(*)(*&^%$#@!#$%^&*()("));
    System.out.println("Number is = "+getOnlyDigits("&(*^*(^(+91-&*9hi-639-0097(&(^("));
}

 public static String getOnlyDigits(String s) {
    Pattern pattern = Pattern.compile("[^0-9]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
 public static String getOnlyStrings(String s) {
    Pattern pattern = Pattern.compile("[^a-z A-Z]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
}

Ergebnis

String is = one
Number is = 9196390097
Turbandroid
quelle
Dies wird arabische Zeichen entfernen
S0haib Nasir
15

Versuchen Sie die replaceAll()Methode der StringKlasse.

Übrigens ist hier die Methode, der Rückgabetyp und die Parameter.

public String replaceAll(String regex,
                         String replacement)

Beispiel:

String str = "Hello +-^ my + - friends ^ ^^-- ^^^ +!";
str = str.replaceAll("[-+^]*", "");

Es sollte alle {'^', '+', '-'} Zeichen entfernen, die Sie entfernen wollten!

omt66
quelle
6

Sonderzeichen entfernen

String t2 = "!@#$%^&*()-';,./?><+abdd";

t2 = t2.replaceAll("\\W+","");

Ausgabe wird sein: abdd.

Das funktioniert perfekt.

Akila
quelle
1
wird illegalen Fluchtcharakter im String-Literal bekommen
John Joe
Dadurch werden auch die Leerzeichen entfernt, wenn Sie die Leerzeichen behalten möchten. Verwenden Sie dann t2 = t2.replaceAll ("[^ \\ w \\ s]", "").
Isuru Dilshan
2

Verwenden Sie die String.replaceAll()Methode in Java. replaceAll sollte für Ihr Problem gut genug sein.

MT.
quelle
1

Sie können einzelne Zeichen wie folgt entfernen:

String str="+919595354336";

 String result = str.replaceAll("\\\\+","");

 System.out.println(result);

AUSGABE:

919595354336
Satya
quelle
0

Wenn Sie nur ein Literal in Java ersetzen möchten, verwenden Sie diese Option, Pattern.quote(string)um eine beliebige Zeichenfolge in ein Literal umzuwandeln.

myString.replaceAll(Pattern.quote(matchingStr), replacementStr)
Tezra
quelle