Reguläre Ausdrücke in Swift: Ein leistungsstarkes Werkzeug für die Textverarbeitung
Reguläre Ausdrücke (regex) sind ein unverzichtbares Werkzeug für iOS- und macOS-Entwickler. Sie ermöglichen komplexe Suche, Ersetzung und Validierung von Textdaten mit kompakten Mustern. In Swift wird die Arbeit mit regulären Ausdrücken über die Klasse NSRegularExpression aus dem Foundation framework implementiert. In diesem Artikel werden wir alle Aspekte der Verwendung von regex in Swift behandeln: von der grundlegenden Syntax bis zu fortgeschrittenen Techniken, mit praktischen Beispielen für iOS- und macOS-Anwendungen.
Grundlagen von NSRegularExpression in Swift
Für die Arbeit mit regulären Ausdrücken in Swift wird die Klasse NSRegularExpression verwendet. Sie bietet leistungsstarke Methoden zum Suchen, Ersetzen und Extrahieren von Daten aus Zeichenketten. Betrachten wir die grundlegende Initialisierungssyntax:
import Foundation
let pattern = "\\\\d{3}-\\\\d{2}-\\\\d{4}" // Muster für SSNlet text = "Meine SSN: 123-45-6789"
do { let regex = try NSRegularExpression(pattern: pattern) let results = regex.matches(in: text, range: NSRange(text.startIndex..., in: text)) for match in results { let range = Range(match.range, in: text)! print("Gefunden: \\(text[range])") }} catch { print("Fehler im regulären Ausdruck: \\(error.localizedDescription)")}Beachten Sie die Maskierung des Backslashs in Swift-Strings. Für jeden Backslash im Muster müssen zwei gesetzt werden (\\\\d statt \\d).
Erstellung und Konfiguration eines regulären Ausdrucks
Der Konstruktor NSRegularExpression akzeptiert einen optionalen Parameter options, der das Verhalten des regex anpasst:
.caseInsensitive— Groß-/Kleinschreibung ignorieren.dotMatchesLineSeparators— Punkt entspricht Zeilenumbruchzeichen.anchorsMatchLines— Anker ^ und $ funktionieren für jede Zeile.useUnixLineSeparators— nur als Zeilentrenner verwenden
let regex = try NSRegularExpression( pattern: "swift", options: [.caseInsensitive])// Jetzt findet das Muster "Swift", "SWIFT", "swift" usw.Suchen und Extrahieren von Daten mit regex
Eine der Hauptaufgaben regulärer Ausdrücke ist die Suche nach Teilzeichenketten, die dem Muster entsprechen. In Swift erfolgt dies über die Methode matches(in:options:range:).
Suche aller Übereinstimmungen
let text = "Kontakte: email@example.com, support@test.org, admin@site.com"let emailPattern = "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}"
let regex = try NSRegularExpression(pattern: emailPattern)let matches = regex.matches(in: text, range: NSRange(text.startIndex..., in: text))
print("Gefundene E-Mails: \\(matches.count)")for match in matches { if let range = Range(match.range, in: text) { print(String(text[range])) }}// Ausgabe:// Gefundene E-Mails: 3// email@example.com// support@test.org// admin@site.comSuche mit Erfassungsgruppen
Gruppen in runden Klammern ermöglichen das Extrahieren von Teilen der Übereinstimmung. Dies ist besonders nützlich für das Parsen strukturierter Daten:
let logLine = "2024-01-15 14:30:22 [ERROR] Verbindung zum Server fehlgeschlagen"let logPattern = "(\\\\d{4}-\\\\d{2}-\\\\d{2}) (\\\\d{2}:\\\\d{2}:\\\\d{2}) \\\\[(\\\\w+)\\\\] (.+)"
let regex = try NSRegularExpression(pattern: logPattern)if let match = regex.firstMatch(in: logLine, range: NSRange(logLine.startIndex..., in: logLine)) { let dateRange = Range(match.range(at: 1), in: logLine)! let timeRange = Range(match.range(at: 2), in: logLine)! let levelRange = Range(match.range(at: 3), in: logLine)! let messageRange = Range(match.range(at: 4), in: logLine)! print("Datum: \\(logLine[dateRange])") print("Zeit: \\(logL")