Frage von Maximilian1989, 37

Wie verwende ich den JavaFX Textformatter mit REGEX?

ich versuche für ein GUI TextFeld eine Einschränkung zu definieren, z.B.: Matrikelnummer = 111.111.111 (die ersten 4 Ziffern müssen zwischen 2000-2005 liegen) . Wie verwende ich einen Textformatter entsprechend um einen Regulären Ausdruck zu definieren?

Hier ist meine Lösung die nicht funktioniert:

TextFormatter mnummer = new TextFormatter(change -> { change.setText(change.getText().replaceAll("[hier müsste der ausdruck stehen ]", "")); return change; });

matrikel.setTextFormatter(mnummer);

Hoffe ihr könnt mir weiterhelfen, Vielen Dank

Expertenantwort
von KnusperPudding, Community-Experte für Java, 28

Das ist ganz schön viel Input.

  • Regex
  • Textformatter
  • Kombination einer schwierigen Logischen Folge mit Regex erzwingen

Fangen wir mit mit dem Formatter an: Um hier vernünftig mit zu hantieren, muss man erstmal verstehen wie Umfangreich dieser Textformatter sein kann. Vor allem greift der Textformatter mit aktuellem Zeichen sobald man ins Feld klickt als auch bei jedem eingegebenem Zeichen. Das ist wichtig zu wissen, vor allem wenn du mit Regular Expressions hantieren willst.

Regex: 

Regular Expressions sind Ausdrücke mit denen du Zeichenfolgen nach bestimmten Mustern absuchen kannst. - Die Möglichkeiten sind endlos. Aber das Thema ist nicht leicht.

Nun möchtest du deinen Textformatter mit einer entsprechenden Funktionalität ausstatten: Das kann knallhart werden, sag ich dir gleich, denn du hast hierbei folgendes zu beachten:

  • Wenn du nun eine Eingabe tätigst, muss der Reguläre Ausdruck Gültig sein, sodass du überhaupt Zeichen eingeben kannst. D.h. du musst bei  111.111.111 auch "erlauben" eine 1 ohne Punkt eingeben zu dürfen, denn sonst kannst du gar nichts in das Textfeld eingeben. 
  • Gleichzeitig musst du abfangen, dass beim Verlassen des Feldes dein Ursprüngliches Format korrekt im Feld steht.
  • Genauso muss es auch für Copy-Paste gelten

Ein einfaches Zahlenformat abzufragen auf Gültigkeit ist relativ simpel:

111.111.111

lässt sich per regex so darstellen:

\d{3}\.\d{3}\.\d{3}

Drei mal drei Zahlen  getrennt von jeweils  einem Punkt.

Problematischer wird es, wenn du bei den Zahlen nun einen Bereich von-bis festlegen willst. hier referenziere ich auf bestehende beispiele: 

http://stackoverflow.com/questions/14067565/4-digit-year-between-year-x-and-year...

Für Regular Expressions empfehle ich die Site regex101.com um eine passende für dich zu entwerfen.

verwende nicht .replaceAll um dein Ziel zu erreichen, denn das wird nicht hinhauen. Es sei denn es reicht dir, die Eingabe von Buchstaben zu verhindern oder ähnlichem.

Wenn du sinnvoll dem Formatter etwas beibringen willst verwende nicht die functional Expression sondern die anonymous inner class. So kannst du via System.out.println()  genug rumspielen bis du zum richtigen Ergebnis kommst.

Antwort
von Zuck3r, 28

Hat dir das noch niemand erzählt?

"Oh look, I've solved a Problem with regex." - created 4 new ones...

Du bekommst einen String im Format 111.111.111?

Dashier check dann ob deine ersten zahlen im definierten Bereich sind:

String s = "111.111.111";

String firstBlock = s.substring(0,4);

firstBlock = firstBlock.replaceAll("\\.", "");

int first = Integer.parseInt(firstBlock);
if (first >2000 && first < 2005)
matrikel.setText(s);

Dann sieht es so aus, als wolltest du einen Textformatter für den Text verwenden. Der formatiert dir aber eine Zahl nur. Zb wenn du einen int 1 hast, kannst ihn damit so formatieren dass er immer 2 nachkommastellen hat, also als 1,00 dargestellt wird.

Du müsstest allerdings genau angeben, was du bekommst und was du haben willst.

Keine passende Antwort gefunden?

Fragen Sie die Community