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.
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 .
+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
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.
publicclassRegularExpressionTest{publicstaticvoid main(String[] args){System.out.println("String is = "+getOnlyStrings("!&(*^*(^(+one(&(^()(*)(*&^%$#@!#$%^&*()("));System.out.println("Number is = "+getOnlyDigits("&(*^*(^(+91-&*9hi-639-0097(&(^("));}publicstaticString getOnlyDigits(String s){Pattern pattern =Pattern.compile("[^0-9]");Matcher matcher = pattern.matcher(s);String number = matcher.replaceAll("");return number;}publicstaticString getOnlyStrings(String s){Pattern pattern =Pattern.compile("[^a-z A-Z]");Matcher matcher = pattern.matcher(s);String number = matcher.replaceAll("");return number;}}
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.
String
Klasse 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 ... :)replaceAll
entfernen Sie diese. Wenn Sie mehr esoterische Anforderungen haben, bearbeiten Sie die Frage. :)replaceAll
fü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.deleteChars.apply( fromString, "-+^.:," );
- finden Sie deleteChars hierAntworten:
Das hängt davon ab, was Sie als Sonderzeichen definieren. Versuchen Sie jedoch Folgendes
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.) ::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:
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:
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 .
quelle
[\P{L}]
-
Zeichen das erste oder letzte in der Liste sein muss oder dass es maskiert werden muss.[^\\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 scheintString result = yourString.replaceAll("[^\w\s]","");
macht FehlerInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Dadurch werden alle Zeichen außer alphanumerisch ersetzt
quelle
Wie hier beschrieben http://developer.android.com/reference/java/util/regex/Pattern.html
Ergebnis
quelle
Versuchen Sie die
replaceAll()
Methode derString
Klasse.Übrigens ist hier die Methode, der Rückgabetyp und die Parameter.
Beispiel:
Es sollte alle {'^', '+', '-'} Zeichen entfernen, die Sie entfernen wollten!
quelle
Sonderzeichen entfernen
Ausgabe wird sein:
abdd.
Das funktioniert perfekt.
quelle
Verwenden Sie die
String.replaceAll()
Methode in Java. replaceAll sollte für Ihr Problem gut genug sein.quelle
Sie können einzelne Zeichen wie folgt entfernen:
AUSGABE:
quelle
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.quelle