RegEx erlaubte Eingabe: Zahlen 2 bis 30

RalU

Mitglied
Hallo,

ich bin auf der Suche nach einem perfekten Regulären Ausdruck zur Überprüfung einer Benutzereingabe in einer
JTextcomponent. Und zwar dürfen nur die Zahlen 2,3,4,...,30 (2 bis 30) eingegeben werden.

An die Textcomponente habe ich einen KeyListener angehangen, der die Benutzereingabe mit einem entsprechenden regulären Ausdruck matchen soll um Falscheingaben erst gar nicht erlaubt.

Mein bisheriger Regulärer Ausdruck sieht folgendermaßen aus:
Code:
String regex = "[1-2]{1}[0-9]{1}|[3]{1}[0]{1}|[2-9]{1}"
Erklärung:
Unterteilung in 3 "Blöcke" :
1. Block: 1. Ziffer 1 oder 2 und 2. Ziffer 0 bis 9
2. Block: 1. Ziffer 3 und 2. Ziffer 0
3. Block: Einstellige Zahlen (eine Ziffer von 2 bis 9)

Er passt prinzipiell ganz gut. Problematisch sind allerdings die Fälle, in denen die erste Ziffer ein 1 ist:
z.B. Eingabe der gültigen Zahl 10 und Eingabe der gültigen Zahl 11.
Erst wenn bei diesen Fällen jede Ziffer GLEICHZEITIG eingebe (also z.B. "11" gleichzeitig auf der Tastatur), wird die Eingabe akzeptiert.
Das Problem liegt natürlich am KeyListener, der den Regulären Ausdruck für jede eingegeben Ziffer neu matcht. Dennoch möchte ich eigentlich den KeyListener benutzen, damit Falscheingaben erst gar nicht
eingegeben werden dürfen.
weiterer Hinweis: Die Textcomponente wird defaultmäßig bei Initalisierung auf den Wert "2" gesetzt, der Focus wird
auf die Stelle "0" in der Textcomponente gesetzt und die 2 wird "markiert", so dass bei der nächsten Eingabe
einfach nur der Wert direkt überschrieben werden kann (ohne <- -Taste zu bedienen).
Weiterhin wird immer die zuletzt gültige Eingabe gesetzt, wenn zuvor eine Eingabe nicht gültig war.
Auch dann wird wie oben der Fokus gesetzt und "markiert".

Gibt es eine Möglichkeit, die noch problematischen Fälle "10" und "11" zu beheben?
Oder gibt es gar einen komplett anderen RegEx zur Lösung des Problems?
 
Zuletzt bearbeitet:
Moin,

so auf die Schnelle fällt mir leider auch keine konkrete Lösung ein :-(

Aber vlt. hilft dies ja weiter:
Wir nutzen hier in der Firma zum Testen von regulären Ausdrücken das nette kleine Tool "RegEx coach"!
Es kann zusammen mit seiner Doku hier runtergeladen werden:
http://weitz.de/regex-coach ("Windows installer" oder "Linux tar archive")

Es eignet sich auch gut zur Einarbeitung in dieses Thema!

Eine weitere gute Übersicht zu den Java Pattern liefert diese Seite:
http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html

Gruß
Klaus
 
Hallo,

du könntest auch einfach einen InputVerifier verwenden:
Java:
package de.tutorials.training;

import java.awt.BorderLayout;
import javax.swing.InputVerifier;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.text.JTextComponent;

public class InputVerifierExample extends JFrame {

  public InputVerifierExample() {
    super("InputVerifierExample");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    final JTextComponent inputField = new JTextField(3);
    inputField.setInputVerifier(new InputVerifier() {
      @Override
      public boolean verify(JComponent input) {
        int number = 0;
        try {
          number = Integer.parseInt(inputField.getText());
        } catch (NumberFormatException e) {
          // ignore
        }
        return number >= 2 && number <= 30;
      }
    });
    
    add(inputField);
    add(new JButton("xxx"),BorderLayout.SOUTH);
    
    setLocationRelativeTo(null);
    pack();
    setVisible(true);
  }

  public static void main(String[] args) {
    new InputVerifierExample();
  }
}

Ansonsten bietet sich JGoodies Validation an:
http://www.jgoodies.com/freeware/validationdemo/index.html
https://validation.dev.java.net/
http://www.google.de/url?sa=t&sourc...ksmMAg&usg=AFQjCNGkjasvHnApxsfiH_O0uWnlzrAk-w

Oder einfach Simple Validation:
http://kenai.com/projects/simplevalidation

Gruß Tom
 
Zurück