Einführung in reguläre Ausdrücke in Rust
\n\nReguläre Ausdrücke (regex) sind ein leistungsstarkes Werkzeug zum Suchen, Extrahieren und Ersetzen von Text nach einem bestimmten Muster. In Rust wird für die Arbeit mit regulären Ausdrücken die Crate regex verwendet – eine der beliebtesten und leistungsfähigsten Bibliotheken des Ökosystems. In diesem Artikel behandeln wir die Grundlagen der Arbeit mit regex in Rust, von der Installation bis zu praktischen Beispielen.
Warum sollte man reguläre Ausdrücke in Rust lernen? Die Sprache bietet eine sichere und schnelle Textverarbeitung, und die Crate regex garantiert Speichersicherheit und hohe Ausführungsgeschwindigkeit. Das macht Rust zu einer ausgezeichneten Wahl für das Parsen von Logs, Formularvalidierung, Verarbeitung von Konfigurationsdateien und andere Aufgaben.
Installation und Einbindung der Crate regex
\n\nFügen Sie zunächst die Abhängigkeit regex zu Ihrer Cargo.toml-Datei hinzu:
[dependencies]\nregex = "1.10"\n\nImportieren Sie anschließend das Modul in Ihren Code:
\n\nuse regex::Regex;\n\nDie Hauptstruktur, mit der Sie arbeiten werden, ist Regex. Eine Instanz kann mit der Methode Regex::new() erstellt werden, die ein Result zurückgibt, da das Muster ungültig sein kann.
fn main() {\n let re = Regex::new(r"^\\d{3}-\\d{2}-\\d{4}$").unwrap();\n println!("Regex erstellt: {}", re.as_str());\n}\n\nBeachten Sie: Das Muster wird in rohen Strings (r"...") geschrieben, um das Escapen von Backslashes zu vermeiden.
Grundlegende Operationen mit regulären Ausdrücken
\n\n1. Prüfung auf Übereinstimmung: is_match
\n\nDie Methode is_match gibt true zurück, wenn das Muster im String gefunden wird:
use regex::Regex;\n\nfn main() {\n let re = Regex::new(r"hello").unwrap();\n let text = "hello world";\n \n if re.is_match(text) {\n println!("Übereinstimmung gefunden!");\n } else {\n println!("Keine Übereinstimmungen");\n }\n}\n\nAusgabe: Übereinstimmung gefunden!
2. Suche nach der ersten Übereinstimmung: find
\n\nDie Methode find gibt Option<Match> zurück – die erste Übereinstimmung mit Positionsinformationen:
use regex::Regex;\n\nfn main() {\n let re = Regex::new(r"\\d+").unwrap();\n let text = "Code: 12345, Preis: 678";\n \n if let Some(m) = re.find(text) {\n println!("Gefunden: '{}' (Position {}..{})", m.as_str(), m.start(), m.end());\n }\n}\n\nAusgabe: Gefunden: '12345' (Position 6..11)
3. Suche nach allen Übereinstimmungen: find_iter
\n\nUm alle Übereinstimmungen zu erhalten, verwenden Sie den Iterator find_iter:
use regex::Regex;\n\nfn main() {\n let re = Regex::new(r"\\d+").unwrap();\n let text = "Zahlen: 42, 100, 7";\n \n for m in re.find_iter(text) {\n println!("Zahl: {}", m.as_str());\n }\n}\n\nAusgabe:
\nZahl: 42\nZahl: 100\nZahl: 7\n\n4. Extraktion von Gruppen: captures
\n\nGruppen im Muster (gekennzeichnet durch runde Klammern) ermöglichen das Extrahieren von Teilen der Übereinstimmung:
\n\nuse regex::Regex;\n\nfn main() {\n let re = Regex::new(r"(\\w+)@(\\w+)\\.(\\w+)").unwrap();\n let email = "user@example.com";\n \n if let Some(caps) = re.captures(email) {\n println!("Vollständige E-Mail: {}", &caps[0]);\n println!("Name: {}", &caps[1]);\n println!("Domain: {}", &caps[2]);\n println!("Zone: {}", &caps[3]);\n }\n}\n\nAusgabe:
\nVollständige E-Mail: user@example.com\nName: user\nDomain: example\nZone: com\n\nPraktische Anwendungsbeispiele
\n\nBeispiel 1: Validierung einer Telefonnummer
\n\nWir prüfen, ob ein String dem Format einer russischen Nummer entspricht (z.B. +7-XXX-XXX-XX-XX):
\n\nuse regex::Regex;\n\nfn v