Reguläre Ausdrücke in Go mit Beispielen: in der Praxis
Reguläre Ausdrücke (Regex) sind ein leistungsstarkes Werkzeug zum Suchen, Extrahieren und Ersetzen von Text nach einem Muster. In Go (Golang) wird für die Arbeit mit ihnen das Standardpaket regexp verwendet, das eine effiziente und sichere API bereitstellt. In diesem Artikel werden wir die wichtigsten Funktionen des Pakets anhand konkreter Beispiele erläutern, die Ihnen helfen, das Wissen sofort in realen Projekten anzuwenden.
Grundlagen des regexp-Pakets in Go
Das Paket regexp implementiert eine Syntax für reguläre Ausdrücke, die mit RE2 kompatibel ist (mit Ausnahme von Rückwärtsreferenzen und Lookahead/Lookbehind). Dies macht es schnell und vorhersagbar. Die wichtigsten Funktionen:
regexp.Compile(pattern)— kompiliert ein Muster in einRegexp-Objekt. Gibt einen Fehler zurück, wenn das Muster ungültig ist.regexp.MustCompile(pattern)— dasselbe, löst aber bei einem Fehler eine Panik aus. Praktisch für statische Muster.MatchString(pattern, s)— prüft, ob die Zeichenketteseine Teilzeichenkette enthält, die dem Muster entspricht.
Verwenden Sie immer Compile für dynamische Muster (z. B. aus Benutzereingaben) und MustCompile für fest im Code definierte Muster.
package main
import ( "fmt" "regexp")
func main() { // MustCompile für ein statisches Muster verwenden re := regexp.MustCompile(`hello`) match := re.MatchString("hello world") fmt.Println(match) // true
// Compile für ein dynamisches Muster pattern := "[0-9]+" re2, err := regexp.Compile(pattern) if err != nil { fmt.Println("Kompilierungsfehler:", err) return } fmt.Println(re2.MatchString("abc123")) // true}Suchen und Extrahieren von Daten
Oft muss man nicht nur eine Übereinstimmung prüfen, sondern bestimmte Teile einer Zeichenkette extrahieren. Dafür werden die Methoden FindString, FindStringSubmatch und FindAllString verwendet.
Extrahieren der ersten Übereinstimmung
package main
import ( "fmt" "regexp")
func main() { re := regexp.MustCompile(`\\d+`) text := "Code: 12345, Preis: 678" // Erste Übereinstimmung first := re.FindString(text) fmt.Println(first) // 12345 // Alle Übereinstimmungen all := re.FindAllString(text, -1) fmt.Println(all) // [12345 678]}Extrahieren von Gruppen (Submatches)
Gruppen in einem Muster (gekennzeichnet durch runde Klammern) ermöglichen das Extrahieren von Teilen einer Übereinstimmung. Die Methode FindStringSubmatch gibt einen Slice zurück, bei dem das erste Element die vollständige Übereinstimmung und die folgenden Elemente die Werte der Gruppen sind.
package main
import ( "fmt" "regexp")
func main() { // Muster: Benutzername @Domain re := regexp.MustCompile(`(\\w+)@(\\w+\\.\\w+)`) email := "user@example.com" match := re.FindStringSubmatch(email) if len(match) > 0 { fmt.Println("Vollständige E-Mail:", match[0]) // user@example.com fmt.Println("Benutzername:", match[1]) // user fmt.Println("Domain:", match[2]) // example.com }}Die Methode FindAllStringSubmatch macht dasselbe für alle Übereinstimmungen in einer Zeichenkette.
Textersetzung mit regulären Ausdrücken
Das Paket regexp bietet zwei Methoden zum Ersetzen: ReplaceAllString (einfache Ersetzung) und ReplaceAllStringFunc (Ersetzung mit einer Funktion).
Einfache Ersetzung
package main
import ( "fmt" "regexp")
func main() { re := regexp.MustCompile(`\\s+`) // ein oder mehrere Leerzeichen text := "Hallo Welt Go" result := re.ReplaceAllString(text, " ") fmt.Println(result) // Hallo Welt Go}Ersetzung mit Gruppen
Im Ersetzungstext kann auf