Reguläre Ausdrücke in Kotlin mit Beispielen: in der Praxis
Reguläre Ausdrücke (regex) sind ein leistungsstarkes Werkzeug für die Textverarbeitung, mit dem Sie Zeichenfolgen nach einem Muster suchen, ersetzen und validieren können. In Kotlin wird die Arbeit mit regulären Ausdrücken über die Klasse Regex und eine Reihe praktischer Erweiterungsfunktionen realisiert. In diesem Artikel werden wir die Syntax, die wichtigsten Methoden und praktische Beispiele besprechen, die Ihnen helfen, regex in Kotlin schnell zu meistern.
1. Grundlagen der Arbeit mit der Regex-Klasse
In Kotlin wird ein regulärer Ausdruck mit der Klasse Regex erstellt. Das Muster kann als Zeichenfolge oder mit einem Raw-String (dreifache Anführungszeichen """) angegeben werden, was besonders praktisch ist, um Backslashes nicht escapen zu müssen.
// Normale Zeichenfolgeval pattern1 = Regex("\\\\d+") // eine oder mehrere Ziffern
// Raw-String (empfohlen)val pattern2 = Regex("""\\d+""") // das Gleiche, aber ohne EscapingDie Klasse Regex akzeptiert auch optionale Flags, z. B. RegexOption.IGNORE_CASE für die Groß-/Kleinschreibung unabhängige Suche.
val caseInsensitive = Regex("""hello""", RegexOption.IGNORE_CASE)2. Wichtigste Methoden: match, find, replace
Kotlin bietet mehrere Schlüsselmethoden für die Arbeit mit regulären Ausdrücken. Betrachten wir die gängigsten.
2.1. Methode matchEntire (vollständige Übereinstimmung)
Prüft, ob die gesamte Zeichenfolge dem Muster entspricht. Gibt MatchResult? oder null zurück.
val regex = Regex("""\\d{3}-\\d{2}-\\d{4}""")val text = "123-45-6789"val matchResult = regex.matchEntire(text)println(matchResult?.value) // Ausgabe: 123-45-6789
// Wenn die Zeichenfolge nicht dem Muster entsprichtval badText = "123-45-678"println(regex.matchEntire(badText)) // Ausgabe: null2.2. Methode find (erste Übereinstimmung)
Sucht das erste Vorkommen des Musters in der Zeichenfolge. Gibt MatchResult? zurück.
val regex = Regex("""\\d+""")val text = "Preis: 150 Rubel, Rabatt: 30%"val firstMatch = regex.find(text)println(firstMatch?.value) // Ausgabe: 1502.3. Methode findAll (alle Übereinstimmungen)
Findet alle nicht überlappenden Vorkommen des Musters. Gibt eine Sequenz von MatchResult zurück.
val regex = Regex("""\\d+""")val text = "Preis: 150 Rubel, Rabatt: 30%"val allMatches = regex.findAll(text)allMatches.forEach { println(it.value) }// Ausgabe:// 150// 302.4. Methode replace (Ersetzung)
Ersetzt alle Vorkommen des Musters durch die angegebene Zeichenfolge oder das Ergebnis eines Lambdas.
val regex = Regex("""\\d+""")val text = "ID: 12345, Code: 67890"val result = regex.replace(text, "***")println(result) // Ausgabe: ID: ***, Code: ***
// Ersetzung mit Lambda (dynamische Ersetzung)val dynamicResult = regex.replace(text) { matchResult -> "[" + matchResult.value.toInt().toString() + "]"}println(dynamicResult) // Ausgabe: ID: [12345], Code: [67890]3. Erfassungsgruppen (capturing groups)
Erfassungsgruppen ermöglichen das Extrahieren von Teilen der Übereinstimmung. In Kotlin kann auf Gruppen über den Index oder den Namen (falls angegeben) zugegriffen werden.
3.1. Zugriff über Index
val regex = Regex("""(\\d{2})\\.(\\d{2})\\.(\\d{4})""") // Datum im Format TT.MM.JJJJval text = "Heute: 15.03.2024"val match = regex.find(text)if (match != null) { val (day, month, year) = match.destructured println("Tag: $day, Monat: $month, Jahr: $year") // Ausgabe: Tag: 15, Monat: 03, Jahr: 2024}3.2. Benannte Gruppen
In Kotlin können benannte Gruppen verwendet werden (Syntax (?<name>...)).
val regex = Regex("""(?<username>\\w+)@(?<domain>\\w+\\.\\w+)""")val text = "email: user@example.com"val match = regex.find(text)if (match != null) { val username = match.groups["u