Frage von Fraagesteller, 30

Gibt es in java für chars etwas äquivalentes wie \\d für Strings?

Hallo =)

wenn man java eine Eingabe auf Zahlen überprüfen will, dann kann man ja "\d" bzw "[0-9]" eingeben, um nicht jede Zahl einzeln eintippen zu müssen.

Meine Frage ist jetzt, ob es so etwas auch für chars gibt. '\d' bzw '[0-9]' funktioniert nicht.

Danke schonmal

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von TeeTier, Community-Experte für programmieren, 17
char c = '5';
boolean b = Character.isDigit(c);

Du könntest deinen Char auch in einen String umwandeln, und dann mit \\d matchen, aber das ist dann sehr teurer und ineffizienter Bloat.

Alternativ kannst du folgendes probieren:

char c = '5';
boolean b = (c >= '0' && c <= '9');

... aber das sollte man sich nicht bei Java-ähnlichen Sprachen, wie z. B. C++ oder gar PHP angewöhnen, da in diesem Fall das Ergebnis vom verwendeten Zeichensatz abhängt. Bei Java wird es allerdings funktionieren.

Die Dritte Möglichkeit wäre eine Lookup-Tabelle, die du auch zur Laufzeit erzeugen kannst, allerdings frisst die dann mindestens 128 KB Speicher, und ob es dir das Wert ist, für so eine kleine Funktion, möchte ich bezweifeln.

Alles in allem ist die statische Methode der Character-Klasse vermutlich die sauberste Lösung, allerdings beachte dabei bitte, dass es mindestens 5 Unicode-Bereiche gibt, deren Zeichen als "Digit" zählen. Es werden also deutlich mehr Zeichen als nur '0' bis '9' als Zahl identifiziert! :)

Kommentar von TeeTier ,

PS: Noch eine Anmerkung zum letzten Absatz ...

Die isDigit()-Methode der Character-Klasse wird auch für Folgendes true zurück liefern:

Character.isDigit('٢')

Das kommt in der Praxis zwar kaum vor, lässt sich aber u. U. als Sicherheitslücke ausnutzen, um Schindluder auf einem Server zu treiben.

Evtl. könntest du dir eine klitze kleine Lookup-Tabelle ausschließlich für die Ascii-Zeichen bauen, und darin nachsehen, ob dein Char eine Zahl ist. Das benötigt dann je nach Implementierung nur noch 128 bis 512 Byte und dürfte sehr schnell und zuverlässig sein, ohne mit Problemen der Kodierung bzw. Zeichensätzen in Berührung zu kommen.

Also behalte bitte immer im Hinterkopf, dass "Unicode" ganz allgemein als Sicherheitslücke einzustufen ist, es sei denn, man kennt sich wirklich richtig gut aus, und weiß, was man tut:

import java.text.*;

class Main {public static void main(String[] args) {
String a = "\u00e1";
String b = "a\u0301";

String eq = a.equals(b) ? "==" : "!=";

System.out.printf("1: '%s' %s '%s'\n", a, eq, b);

a = Normalizer.normalize(a, Normalizer.Form.NFD);
b = Normalizer.normalize(a, Normalizer.Form.NFD);

eq = a.equals(b) ? "==" : "!=";

System.out.printf("2: '%s' %s '%s'\n", a, eq, b);}
}

Das Programm liefert folgende Ausgabe (kann sein, dass hier bei GF einige Zeichen nicht korrekt dargestellt werden!):

1: 'á' != 'á'
2: 'á' == 'á'

Es ist möglich, dass ein ähnliches Verhalten ebenfalls bei Char.isdigit() auftritt, also verwende diese Methode NIEMALS in Serveranwendungen, es sei denn, du hast Vorkehrungen getroffen und du weißt genau, was du tust.

So unglaublich es klingt, aber über eine derartige Lücke kann man unter günstigen Umständen beliebigen Code auf fremden Servern ausführen. Und das ist in der Vergangenheit auch schon des Öfteren passiert. Also sei vorsichtig, wenn du nicht genau weißt, wie Unicode funktioniert.

Viel Spaß! :)

Kommentar von Fraagesteller ,

perfekt vielen dank! 

Kommentar von TeeTier ,

Hoppala, die Zeile mit der zweiten Zuweisung an die Variable "b" enthält einen Copy&Paste-Fehler. Die Zeile muss natürlich wie folgt aussehen:

b = Normalizer.normalize(b, Normalizer.Form.NFD);

Lustigerweise ändert das nichts an der Korrektheit und der Ausgabe des restlichen Programms. Also halb so schlimm. :)

Antwort
von threadi, 30

Schau mal ins Manual: https://docs.oracle.com/javase/tutorial/essential/regex/pre_char_classes.html

Kommentar von Fraagesteller ,

das gilt nur für Strings wenn ich das richtig sehe oder?

Kommentar von threadi ,

So sehe ich das auch.

Keine passende Antwort gefunden?

Fragen Sie die Community