Reguläre Ausdrücke in Java (RegEx)

In diesem Modul lernst du, wie du reguläre Ausdrücke in Java (regular expressions, kurz RegEx) einsetzt, um Text zu durchsuchen, zu prüfen oder zu verarbeiten.
SBB Logo

Entschuldige, da fehlt noch was...

--> Erster Release, muss noch angeschaut und Aufgaben müssen definiert werden

Ziele

  • Ich weiss, wie ich in Java reguläre Ausdrücke mit Pattern und Matcher verwende.
  • Ich kann einfache RegEx-Ausdrücke in Java-Code integrieren.
  • Ich kenne Sicherheitsaspekte bei der Verwendung von RegEx in Java.
⏱️ Geschätzte Lesezeit: 15 Minuten

Einführung

Lies zuerst das Modul Regex, bevor du hier weitermachst.

In Java werden reguläre Ausdrücke über die Klassen java.util.regex.Pattern und java.util.regex.Matcher verwendet.

Typische Anwendungsfälle:

  • Prüfen, ob ein String einem Muster entspricht
  • Teilstrings extrahieren
  • Text mit Mustererkennung ersetzen

Beispiel: Prüfen einer E-Mail-Adresse

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class EmailCheck {
    public static void main(String[] args) {
        String email = "test@example.com";
        String regex = "^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(email);

        if (matcher.matches()) {
            System.out.println("E-Mail ist gültig");
        } else {
            System.out.println("E-Mail ist ungültig");
        }
    }
}

Beispiel: Alle Zahlen aus einem Text extrahieren

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class NumberExtractor {
    public static void main(String[] args) {
        String text = "Artikel 123 kostet 45 CHF";
        Pattern pattern = Pattern.compile("\\d+");
        Matcher matcher = pattern.matcher(text);

        while (matcher.find()) {
            System.out.println("Gefunden: " + matcher.group());
        }
    }
}

Ausgabe:

1
2
Gefunden: 123
Gefunden: 45

Beispiel: Text ersetzen

1
2
3
4
5
6
7
8
public class ReplaceExample {
    public static void main(String[] args) {
        String text = "Meine Telefonnummer ist 079 123 45 67";
        String hidden = text.replaceAll("\\d", "X");

        System.out.println(hidden);
    }
}

Ausgabe:

1
Meine Telefonnummer ist XXX XXX XX XX

Sicherheitsaspekte bei RegEx in Java

1. Catastrophic Backtracking

  • Problem: Auch in Java kann ein ungünstig formulierter RegEx zu extrem langer Laufzeit führen.
  • Beispiel:
    1
    2
    3
    4
    
    String regex = "(a+)+$";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!");
    System.out.println(matcher.matches()); // dauert sehr lange
    
  • Lösung: Verwende möglichst präzise Quantifizierer ({1,10} statt +), Atomic Groups ((?>...)) oder possessive Quantifiers (++, *+).

2. Injection durch dynamische Muster

  • Problem: Wenn der RegEx direkt aus Benutzereingaben besteht, kann er manipuliert werden.
  • Unsicher:
    1
    
    Pattern pattern = Pattern.compile(userInput);
    
  • Sicherer: Benutzereingabe escapen:
    1
    2
    
    String safeInput = Pattern.quote(userInput);
    Pattern pattern = Pattern.compile(safeInput);
    

3. Übermäßige Komplexität

  • Problem: Java-Entwickler neigen dazu, sehr komplexe RegEx zu schreiben, die kaum wartbar sind.
  • Empfehlung: Komplexe Muster aufteilen, ggf. mit Kommentaren ((?x)-Flag) lesbarer machen.

4. Falsche Annahmen bei Validierung

  • Problem: Nur weil ein String das Muster erfüllt, heißt das nicht, dass er inhaltlich gültig ist.
  • Beispiel: a@b.c erfüllt viele E-Mail-RegEx, ist aber oft ungültig.

Best Practices für RegEx in Java

  1. Immer testen – mit realistischen und Worst-Case-Eingaben.
  2. Komplexität reduzieren – ggf. mehrere kleine RegEx verwenden.
  3. Benutzereingaben escapenPattern.quote() nutzen.
  4. Performance im Blick behalten – keine unkontrollierten .* in Kombination mit .+.

Tipp

Testen von Java-RegEx-Ausdrücken online:


Zuletzt geändert July 29, 2025: Fix link title (a19ab159d)