DanLevy.net

Regex: Vom Anfänger zum Profi

URL-ähnliche Strings extrahieren & parsen mit einem einzigen Regex

Inhaltsverzeichnis

TL;DR: Springen Sie direkt zum 120+ Byte Regex.

🚀 Einleitung

Das Extrahieren von URLs aus rohem Text kann sich schnell in ein mühsames Whack-a-Mole-Spiel verwandeln. Interpunktion, umgebende Klammern und mehrdeutige Formatierungen arbeiten zusammen, um Ihre Bemühungen zu vereiteln. Ob Sie einen Web-Scraper, einen Datenanalysator oder eine Chat-Anwendung entwickeln – das präzise Extrahieren von URLs ist unverzichtbar.

In diesem Beitrag gehen wir das Problem direkt an und setzen auf einen flexiblen, zweistufigen Ansatz. Unser Ziel ist es, zunächst alle potenziellen URL-ähnlichen Strings zu erfassen und die Validierung einem nachgelagerten Schritt zu überlassen.

💡 Hinweis: Dieses Muster dient nicht der Validierung von URLs! Es ist bewusst tolerant gegenüber Interpunktion und Tippfehlern.

🔍 Ziel: URLs aus Text extrahieren

Beim Extrahieren von URLs aus rohem Text bewährt sich ein zweistufiger Ansatz:

  1. Alles URL-ähnliche erfassen: Ein weites Netz werfen, um alle Strings zu sammeln, die möglicherweise URLs sind. Genau hier kommt unser „120-Byte-Regex“ ins Spiel.
  2. Validieren: Sobald diese Kandidaten erfasst sind, nutzen Sie sekundäre Prüfungen (z. B. DNS-Auflösung, Abgleich mit bekannten Domains), um ungültige Einträge herauszufiltern.

Die Herausforderung visualisieren

Begriffe wie extract und parse werden oft synonym verwendet, bezeichnen jedoch unterschiedliche Prozesse. Das Extrahieren von URLs bedeutet, potenzielle URLs aus einem größeren Textkorpus zu identifizieren und zu erfassen. Das Parsen hingegen zerlegt diese URLs in ihre Einzelkomponenten.

Wenn ich von Parsing oder „URL-Teilen“ spreche, meine ich folgende Komponenten:

Die 5 Bestandteile jeder URL
Anatomie einer URL, visualisiert

Klicken Sie, um einen Screenshot der Substring-Matches in RegEx101 zu sehen.

Bevor wir zu tief in die Regex einsteigen, nutzen wir ein visuelles Tool, um zu prüfen, wie gut mein Muster mehrere Treffer erfasst:

Visualisierung von Mehrzeilen-Treffern mit RegEx101.com
Vorschau der „Bulk“-Mehrzeilen-Treffer

Die 120+ Byte Regex

Im Folgenden finden Sie eine kompakte Regex, die URLs in einem einzigen Durchlauf extrahiert und parst. Sie unterstützt verschiedene Protokolle, Domains, Pfade sowie optionale Query- und Fragment-Bereiche.

Keine Sorge – wir zerlegen das Schritt für Schritt!

120+ Byte URL Regex
const urlRegex = /([-.a-z0-9]+:\/{1,3})([^-\/\.[\](|)\s?][^`\/\s\]?]+)([-_a-z0-9!@$%^&*()=+;/~\.]*)[?]?([^#\s`?]*)[#]?([^#\s'"`\.,!]*)/gi;
// Compatibility: ES5+
// Same pattern, split on newlines for readability:
([-.a-z0-9]+:\/{1,3})
([^-\/\.[\](|)\s?][^`\/\s\]?]+)
([-_a-z0-9!@$%^&*()=+;/~\.]*)
[?]?([^#\s`?]*)
[#]?([^#\s'"`\.,!]*)
Teilt die wildesten Regex-Patterns, die ihr je gesehen (oder selbst verfasst) habt, in den Kommentaren unten! 🚀

🧩 Schritt für Schritt zerlegt

Wir zerlegen die Regex in ihre Komponenten, um den Aufbau zu verstehen:

1. Protokoll (Gruppe 1): ([-.a-z0-9]+:/{1,3})

2. Domain (Gruppe 2): ([^-/.[](|)s?][^`/s]?]+)

3. Pfad (Gruppe 3): ([-_a-z0-9!@$%^&*()=+;/~\.]*)

4. Query (Gruppe 4): [?]?([^#\s`?]*)

5. Fragment (Gruppe 5): [#]?([^#\s’”`.,!]*)

🛠️ Parsing-Beispiel

So setzen Sie diesen Regex-Monster mit etwas JavaScript in die Praxis um:

☑️ Nächste Schritte

Je nach Anwendungsfall müssen Sie diesen Regex möglicherweise verfeinern oder zusätzliche Validierungs- und Nachbearbeitungsschritte einfügen.

Unterschiedliche Projekte, unterschiedliche Anforderungen

Projekte unterscheiden sich in ihren Anforderungen und Sicherheitsbedenken:

  1. Web Scraping: URLs validieren, um Erreichbarkeit und Vertrauenswürdigkeit sicherzustellen.
  2. Datenverarbeitung: URLs aus nutzergenerierten Inhalten extrahieren, dabei Sicherheitsaspekte wahren.
  3. Datenanalyse: Duplikate oder irrelevante Links für Forschungs- oder Marketingzwecke herausfiltern.
  4. Anwendungen mit Benutzeroberfläche: URLs in Chat-Apps oder Foren automatisch verlinken.

Nachbearbeitung und Validierung

Nach dem Sammeln potenzieller URLs sind zusätzliche Prüfungen erforderlich:

📝 Zusammenfassung

Das Extrahieren semistrukturierter String-Daten ist vielleicht der befriedigendste Aspekt der Regex-Meisterschaft.

Hier ist eine Zusammenfassung der wichtigsten Erkenntnisse:

Die Einhaltung dieser Schritte ermöglicht die effektive Extraktion beliebiger semistrukturierter String-Daten und schafft die Voraussetzung für nachgelagerte Verarbeitung und Validierung.

📚 Weiterführende Ressourcen