Reguläre Ausdrücke in Go mit Beispielen: in der Praxis
\n\nReguläre Ausdrücke (regexp) sind ein leistungsstarkes Werkzeug zum Suchen, Extrahieren und Ersetzen von Text nach einem Muster. In Go (Golang) wird die Arbeit mit regulären Ausdrücken über das Standardpaket regexp realisiert. In diesem Artikel werden wir die wichtigsten Funktionen, die Syntax und praktische Beispiele durchgehen, die Ihnen helfen, reguläre Ausdrücke sicher in Ihren Projekten zu verwenden.
Grundlagen des Pakets regexp
\n\nDas Paket regexp bietet zwei Hauptmethoden zur Kompilierung eines regulären Ausdrucks:
- \n
regexp.Compile(pattern string) (*Regexp, error)— kompiliert das Muster und gibt einRegexp-Objekt oder einen Fehler zurück, wenn das Muster ungültig ist. \n regexp.MustCompile(pattern string) *Regexp— dasselbe, löst aber bei einem Fehler einenpanicaus. Praktisch für statische Muster, die zur Initialisierungszeit definiert werden. \n
Es wird empfohlen, MustCompile für Muster zu verwenden, die garantiert korrekt sind (z. B. im Code festgelegt), und Compile für dynamische Muster, die vom Benutzer oder aus einer externen Quelle stammen.
Beispiel 1: Suchen einer Teilzeichenkette (FindString)
\n\nDie Funktion FindString gibt die erste Übereinstimmung mit dem Muster als Zeichenkette zurück. Wenn keine Übereinstimmung gefunden wird, wird eine leere Zeichenkette zurückgegeben.
package main\n\nimport (\n "fmt"\n "regexp"\n)\n\nfunc main() {\n text := "Meine E-Mail: example@mail.com, Ersatz: test@example.org"\n pattern := `[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}`\n\n re := regexp.MustCompile(pattern)\n match := re.FindString(text)\n\n fmt.Println("Gefundene E-Mail:", match) // Ausgabe: example@mail.com\n}\n\nBeispiel 2: Suchen aller Übereinstimmungen (FindAllString)
\n\nWenn Sie alle Übereinstimmungen finden müssen, verwenden Sie FindAllString. Das zweite Argument ist die maximale Anzahl von Übereinstimmungen (-1 für alle).
package main\n\nimport (\n "fmt"\n "regexp"\n)\n\nfunc main() {\n text := "Codes: ABC-123, XYZ-456, QWE-789"\n pattern := `[A-Z]{3}-\\d{3}`\n\n re := regexp.MustCompile(pattern)\n matches := re.FindAllString(text, -1)\n\n fmt.Println("Gefundene Codes:", matches)\n // Ausgabe: [ABC-123 XYZ-456 QWE-789]\n}\n\nBeispiel 3: Text ersetzen (ReplaceAllString)
\n\nReplaceAllString ersetzt alle Übereinstimmungen des Musters durch die angegebene Zeichenkette. Sie können Erfassungsgruppen mit der Syntax $1, $2 usw. verwenden.
package main\n\nimport (\n "fmt"\n "regexp"\n)\n\nfunc main() {\n text := "Datum: 2024-01-15, weiteres Datum: 2023-12-31"\n pattern := `(\\d{4})-(\\d{2})-(\\d{2})`\n\n re := regexp.MustCompile(pattern)\n // Format von JJJJ-MM-TT auf TT.MM.JJJJ ändern\n result := re.ReplaceAllString(text, "$3.$2.$1")\n\n fmt.Println("Ergebnis:", result)\n // Ausgabe: Datum: 15.01.2024, weiteres Datum: 31.12.2023\n}\n\nBeispiel 4: Prüfen, ob eine Zeichenkette dem Muster entspricht (MatchString)
\n\nDie Funktion MatchString gibt true zurück, wenn die Zeichenkette mindestens eine Übereinstimmung mit dem Muster enthält.
package main\n\nimport (\n "fmt"\n "regexp"\n)\n\nfunc main() {\n emails := []string{"user@example.com", "invalid-email", "admin@site.org"}\n pattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$`\n\n re := regexp.MustCompile(pattern)\n for _, email := range emails {\n if re.MatchString(email) {\n fmt.Printf("'%s' — gültige E-Mail\\n", email)\n } else {\n fmt.Printf("'%s' — KEINE gültige E-Mail\\n", email)\n }\n }\n // Ausgabe:\n // 'user@example.com' — gültige E-Mail\n // 'invalid-email' — KEINE gültige E-Mail\n // 'admin@site.org' — gültige E-Mail\n}\n\nBeispiel 5: Daten mit Erfassungsgruppen extrahieren (FindStringSubmatch)
\n\nFindString