~Java4Beginners~
~Java4Beginners~

Regular Expressions

Ein regulärer Ausdruck ist in der theoretischen Informatik eine Zeichenkette, die der Beschreibung von Mengen von Zeichenketten mit Hilfe bestimmter syntaktischer Regeln dient. Reguläre Ausdrücke finden vor allem in der Softwareentwicklung Verwendung. Neben Implementierungen in vielen Programmiersprachen verarbeiten auch viele Texteditoren reguläre Ausdrücke in der Funktion „Suchen und Ersetzen“. Ein einfacher Anwendungsfall von regulären Ausdrücken sind Wildcards.

Was verbirgt sich dahinter? Die String-Klasse verfügt über die Methode matches, mit welcher wir eine Zeichenkette prüfen können, ob Sie einer bestimmten Syntax entspricht.

In Java verwenden wir die regular Expressions im Normalfall, wenn wir überprüfen möchten, ob eine Benutzereingabe bestimmten Kriterien entspricht, bevor wir Sie entweder weiterverarbeiten oder abspeichern. matches liefert einen true oder false - Wert zurück, was uns schon erkennen lässt, dass wir die Prüfung in einer Kontrollstruktur verwenden.

Schreibweise


String eingabe = "Testeingabe";
boolean richtig = eingabe.matches("Hier steht nun unsere Regexanweisung");

Reguläre Ausdrücke

In der nachfolgenden Tabelle habe ich der Reihenfolge nach die regulären Ausdrücke aufgeführt, welche in den nachfolgenden Beispielprogrammen verwendet werden.
RegEx Beschreibung Beispiel
eingabe.matches("[123456]") Das Ergebnis ist nur true, wenn die Eingabe aus einem Zeichen besteht, und dieses Zeichen eine 1, 2, 3, 4, 5 oder 6 ist. Schulnoten
plz.matches("[15]"); Das Ergebnis ist nur true, wenn das Zeichen aus einer 1 oder einer 5 besteht . Erklärung
eingabe.matches("[1-6]") Das Ergebnis ist nur true, wenn die Eingabe aus einem Zeichen besteht, und dieses Zeichen eine 1, 2, 3, 4, 5 oder 6 ist. Schulnoten
plz.matches("[0-9]+"); Das Ergebnis ist nur true, wenn alle Zeichen aus Ziffern aus dem Ziffernbereich 0 bis 9 bestehen. Erklärung
plz.matches("[0-9][0-9][0-9][0-9][0-9]"); Das Ergebnis ist nur true, wenn 5 Ziffern von 0 bis 9 hintereinander eingegeben wurden. Postleitzahl
plz.matches("[1-9][0-9]{3,5}"); Das Ergebnis ist nur true, wenn das erste Zeichen aus dem Ziffernbereich 1 bis 9 besteht und anschließend mindestens 3, aber maximal 5 Zeichen mit Ziffern aus dem Ziffernbereich 0 bis 9 folgen. Erklärung
plz.matches("[1-9][0-9]{3,}"); Das Ergebnis ist nur true, wenn das erste Zeichen aus dem Ziffernbereich 1 bis 9 besteht und anschließend mindestens 3 Zeichen mit Ziffern aus dem Ziffernbereich 0 bis 9 folgen. Erklärung
plz.matches("[0-9]{5}"); Das Ergebnis ist nur true, wenn die 5 Zeichen hintereinander aus Ziffern von 0 bis 9 bestehen. Postleitzahl

Einfache Ausdrücke

Fangen wir klein an. Wir wollen überprüfen, ob in einem Programm, welches Schulnoten verwaltet, die Eingabe der Noten logisch richtig sein kann. Logisch richtig ist die Eingabe, wenn Sie nur die Note 1, 2, 3, 4, 5 oder 6 enthält.

Den regular Expressions hinterlegen wir in eckigen Klammern []. Diese Klammer steht für 1 Zeichen, was für unsere Schulnoten vollkommen ausreichend momentan ist.

package regex;

import java.util.Scanner;

/**
 * Regexprüfung Schulnoten 1 bis 6
 * @author Markus Badzura
 */
public class schulnoten 
{
  public static Scanner sc = new Scanner(System.in);
  public static void main(String[] args) 
  {
    System.out.println("Welche Note wurde geschrieben? :");
    String eingabe = sc.next();
    if (eingabe.matches("[123456]"))
    {
      System.out.println("Diese Eingabe ist logisch richtig");
    }
    else
    {
      System.out.println("Diese Eingabe ist fehlerhaft.");
    }
  }
}
Es ist zu erkennen, dass die Notenwerte zusammenhängend sind, also ein Interval von - bis bilden. Intervalle lassen sich mit einem Minus-Zeichen zusammenfassen, in dem wir den ersten und letzen inclusive-Wert eingeben. Nachfolgend wurde das Programm schulnoten noch um diese Vereinfachung ergänzt.

    if (eingabe.matches("[1-6]"))
    {
      System.out.println("Diese Eingabe ist logisch richtig");
    }
    else
    {
      System.out.println("Diese Eingabe ist fehlerhaft.");
    }
Zurück zur Übersicht

Prüfung feste Ziffernwiederholung

Nehmen wir an, wir wollen eine Eingabe der Postleitzahl überprüfen. Nach obiger Erklärung steht die eckige Klammer für 1 Zeichen. Wollen wir also die Postleitzahl prüfen, so würden wir mit dieser Erkenntnis auf folgendes Beispiel kommen.

plz.matches("[0-9][0-9][0-9][0-9][0-9]");
Rein syntaktisch ist dies ein gültiger Regex, allerdings etwas lange. Was auffällt bei der Postleitzahl ist, dass die Prüfung pro Zeichen identisch ist, nämlich 0-9. Diese Prüfung wiederholt sich 5 mal. Somit können wir eine weitere syntaktische Schreibweise verwenden.

[RegEx]{Anzahl}.

Somit können wir obige Schreibweise etwas einkürzen.

plz.matches("[0-9]{5}");
In folgendem Beispielprogramm wird dies Postleitzahlenprüfung praktisch angewandt. Vorteil dieser Prüfung ist es, dass wir a) prüfen, ob 5 Zeichen eingetragen wurden und b) dass diese 5 Zeichen Ziffern sind.

package regex;

import java.util.Scanner;

/**
 * Regexprüfung Postleitzahlen
 * @author Markus Badzura
 */
public class Postleitzahlen 
{
  private static Scanner sc = new Scanner(System.in);
  public static void main(String[] args) 
  {
    String eingabe;
    boolean ok = false;
    System.out.println("Bitte geben Sie die PLZ ein: ");
    do
    {
      eingabe = sc.next();
      if(eingabe.matches("[0-9]{5}"))
      {
        ok = true;
      }
      else
      {
        System.out.println("Bitte geben Sie eine korrekte PLZ ein.");
      }
    }
    while(!ok);      
    System.out.println("Postleitzahl in Ordnung");
  }
}
Zurück zur Übersicht

Einzelne Ziffern oder unbegrenzte, bzw begrenzte Zifferneingabe

In einer Konsolenmenüführung ist es erforderlich, die Konsoleneingabe auf die Richtigkeit der zur Verfügung Ziffern zu überprüfen. Wie wir bereits festgestellt haben, zählt ein []-Paar als 1 Zeichen. Innerhalb dieser Klammer schreiben wir unsere Zeichen hinein, welche überprüft werden sollen.

Wenn wir nur auf die beiden Ziffern 1 und 5 überprüfen wollen, schreiben wir als RegEx [15]. Dies bedeuted nicht fünfzehn, sondern bedeutet, dass an dieser Position als Zeichen nur eine 1 oder eine 5 zulässig ist.

Wenn wir eine Zeichenkette auf eine Integerzahl mit unbekannter Länge überprüfen wollen, wäre es, ähnlich wie bei Postleistzahl, unsinnig, viele [0-9] hintereinander zu schreiben. Wäre auch ziemlich unpassend, weil wir dann schon die Anzahl der Ziffern der Zahl kennen müssten. Dieses Problem können wir so lösen, dass wir als Regex folgende Anweisung übergeben. Diese Position kann ein Zeichen zwischen 0 bis 9 enthalten und kann beliebig oft direkt im Anschluss an diese Position wiederholt werden.

In Kurzform und als Regex lautet diese: [0-9]+

Wenn wir eine führende 0 ausschließen möchten, dann müssten wir sagen, dass die erste Position eine Ziffer zwischen 1 und 9 sein muss, und dann unbegrenzt die Ziffern 0 bis 9 folgen können.

In RegEx-Schreibweise wäre dies [1-9][0-9]+ Der letzte Fall wäre nun, dass wir nur einen Zahlenbereich von 1000 bis 999999 zulassen möchten. Was haben diese beiden Grenzzahlen gemeinsam? Die erste Ziffer bei beiden Ziffern zwischen 1 und 9. Bei der Zahl 1000 folgen 3 Ziffern von 0 bis 9, während es bei der 999999 5 Ziffern sind.

Somit kann man sagen, dass eine gültige Zahl in diesem geforderten Zahlenbereich als erste Ziffer aus einer Ziffer zwischen 1 und 9 besteht, dass anschließend mindestens 3, aber maximal 5 Ziffern mit den Ziffern 0 bis 9 folgen können. Diese min - max Angabe lässt sich mit geschweiften Klammern mit der Syntax {MIN,MAX} verwirklichen.

In RegEx-Schreibweise können wir sagen: [1-9][0-9]{3,5}

Wenn wir nur einen Mindestwert angeben möchten, also dass die Zahl mindestens eine 1000er-Zahl sein muss, aber ansonsten unbegrenzt lang sein kann, so verwenden wir die gleich Schreibweise, mit der Ausnahe, dass wir keinen MAX-Wert eingeben.

[1-9][0-9]{3,} -> beachtet, dass wir das Komma für die Trennung zum nicht angegebenen Max-Wert benötigen, da ansonsten die Regex besagen würde, dass es 3 Ziffern sein müssen, keine mehr und keine weniger.
Zurück zur Übersicht
nach oben Java4Beginners -- Seitenversion 1.03 -- Stand: 2017-07-06