Reguläre Ausdrücke in Java: Von den Grundlagen bis zur fortgeschrittenen Anwendung
Reguläre Ausdrücke (regex) sind ein leistungsstarkes Werkzeug für die Textverarbeitung, mit dem Sie Suchen, Ersetzen und Überprüfen von Zeichenketten anhand komplexer Muster durchführen können. In Java wird die Unterstützung für reguläre Ausdrücke über das Paket java.util.regex implementiert, das zwei Hauptklassen bereitstellt: Pattern (kompiliert das Muster) und Matcher (führt Such-/Ersetzungsoperationen durch).
In diesem Artikel werden wir uns ansehen, wie man reguläre Ausdrücke in Java effektiv einsetzt, angefangen bei der grundlegenden Syntax bis hin zu realen Beispielen aus der Entwicklungspraxis.
1. Grundlagen der Syntax regulärer Ausdrücke in Java
Bevor wir zum Java-Code übergehen, ist es wichtig, die grundlegenden Metazeichen regulärer Ausdrücke zu beherrschen:
.— ein beliebiges einzelnes Zeichen (außer Zeilenumbruch)\\d— eine beliebige Ziffer (0-9)\\w— Buchstabe, Ziffer oder Unterstrich\\s— Leerzeichen (Leerzeichen, Tabulator, neue Zeile)*— 0 oder mehr Wiederholungen des vorherigen Zeichens+— 1 oder mehr Wiederholungen?— 0 oder 1 Wiederholung (macht das Zeichen optional)^— Zeilenanfang$— Zeilenende[...]— Zeichenklasse (z.B.[a-z]— alle Kleinbuchstaben)(...)— Erfassungsgruppe
Wichtig: In Java erfordern Zeichenketten mit regulären Ausdrücken doppelte Maskierung. Um beispielsweise \\d zu verwenden, schreiben wir im Code "\\\\d". Dies liegt daran, dass der umgekehrte Schrägstrich zuerst vom Java-Compiler verarbeitet und dann an die Regex-Engine übergeben wird.
2. Die Klassen Pattern und Matcher — die Grundlage für die Arbeit mit regex in Java
Das grundlegende Schema für die Arbeit mit regulären Ausdrücken in Java besteht aus drei Schritten:
- Erstellen eines
Pattern-Objekts durch Kompilieren der Musterzeichenkette - Erstellen eines
Matcher-Objekts durch Aufrufen der Methodematcher()auf der zu überprüfenden Zeichenkette - Durchführen von Operationen — Suchen, Abgleichen, Ersetzen
Beispiel 1: Überprüfung der Übereinstimmung der gesamten Zeichenkette
import java.util.regex.Pattern;import java.util.regex.Matcher;
public class RegexExample { public static void main(String[] args) { // Überprüfung, ob die Zeichenkette eine gültige E-Mail-Adresse ist String email = "user@example.com"; String emailPattern = "^[A-Za-z0-9+_.-]+@(.+)$"; Pattern pattern = Pattern.compile(emailPattern); Matcher matcher = pattern.matcher(email); if (matcher.matches()) { System.out.println("Email ist gültig"); } else { System.out.println("Email ist ungültig"); } }}Die Methode matches() versucht, das Muster mit der gesamten Zeichenkette abzugleichen. Wenn überprüft werden soll, ob die Zeichenkette eine Übereinstimmung mit dem Muster enthält (nicht unbedingt vollständig), wird die Methode find() verwendet.
Beispiel 2: Suchen aller Vorkommen eines Musters in einer Zeichenkette
import java.util.regex.Pattern;import java.util.regex.Matcher;
public class FindExample { public static void main(String[] args) { String text = "Java 8, Java 11, Java 17 — das sind Versionen der Sprache Java"; String regex = "Java\\\\s+\\\\d+"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(text); while (matcher.find()) { System.out.println("Gefunden: " + matcher.group() + " (Position: " + matcher.start() + "-" + matcher.end() + ")"); } }}Ergebnis der Ausführung:
Gefunden: Java 8 (Position: 0-6)Gefunden: Java 11 (Position: 8-15