Wie extrahiert man URLs mithilfe von Regex
- Hilfe anfragen
- → Alle Minitutorials
- → Alle deutschsprachigen Blogartikel
- → Alle englischsprachigen Blogartikel
- → Lernumgebungen
- → FreeBSD Linkliste
Ein fertiges Beispiel findet sich ganz unten auf dieser Seite. Zunächst gilt es, etwas Theorie aus der FreeBSD Implementierung von re_format(7) zu vestehen:
Reguläre Ausdrücke für Systemadministratoren
Bei der vorliegenden Implementierung spricht man von "extended" oder "modern" regulären Ausdrücken. Dabei handelt es sich im eine mehrere nicht leere branches, mit | als Trennzeichen.
Was das bedeutet
Eine branch besteht aus einem oder mehreren pieces, welche zusammengesetzt werden. Erstere erkennt eine Zeichenkette als Treffer, wenn auf das erste piece das zweite, dritte, ... piece folgt.
Ein piece ist ein atom, welchem die Platzhaltersymbole *, +, ? or bound folgen können.
- Ein atom gefolgt von * erkennt eine Zeichenkette bestehend aus 0 oder mehr Zeichenketten, welche das atom ausmachen.
- Ein atom gefolgt von + erkennt eine Zeichenkette bestehend aus 1 oder mehr Zeichenketten, welche das atom ausmachen.
- Ein atom gefolgt von ? erkennt eine Zeichenkette bestehend aus 0 oder 1 Zeichenketten, welche das atom ausmachen.
- bound Beispiel: {2,8} wobei Zahlen von 0 bis einschließlich 255 gültige Werte darstellen; die erste Zahl darf nicht größer sein als die zweite.
- Ein atom gefolgt von {8} erkennt eine Zeichenkette bestehend aus exakt 8 Zeichenketten, welche das atom ausmachen.
- Ein atom gefolgt von {8} erkennt eine Zeichenkette bestehend aus 8 oder mehr Zeichenketten, welche das atom ausmachen.
- Ein atom gefolgt von {0,42} erkennt eine Zeichenkette bestehend aus 0 bis einschließlich 42 Zeichenketten, welche das atom ausmachen.
Ein atom kann bestehen aus:
- Einem regulären Ausdruck innherlab von (), welcher eine Zeichenkette als Treffer erkennt, die diesen regulären Ausdruck ausmacht.
- Einem leeren () Paar, welches keine lesbare Zeichenkette, sondern einen null string als Treffer erkennt.
- Einem Punkt . welcher ein beliebiges einzelnes Zeichen als Treffer erkennt.
- Ein Exponentialzeichen ^ ("caret"), welches den null string am Anfang einer Zeile als Treffer erkennt.
- Ein Dollarzeichen $, welches den null string am Ende einer Zeile als Treffer erkennt.
- Ein einzelnes Sonderzeichen mit vorangestelltem Fluchtsymbol, was dieses Sonderzeichen als Treffer erkennt:
- Im den meisten fällen stellt der Backlash das Fluchtsymbol dar: \
- Sonderzeichen, welche ein Fluchtsymbol benötigen, um als Treffer erkannt zu werden: ^ . [ $ ( ) | * + ? { \
- Eine einzelne Kombination aus einem Fluchtsymbol \ und jedem beliebigen sonstigen Zeichen, welches eigentlich kein Fluchtsymbol benötigt, um als Treffer erkannt zu werden, wird als dieses sonstige Zeichen und somit als Treffer erkannt, als wäre das Fluchtsymbol \ im regulären Ausdruck nicht vorhanden.
- Ein einzelnes Zeichen ohne Sonderfunktion wird als dieses Zeichen als Treffer erkannt.
- HINWEIS: eine öffnende geschweifte Klammer, gefolgt von einem Zeichen, welches keine Ziffer darstellt, stellt ein normales Zeichen ohne Sonderfunktion dar und nicht den Beginn eines bound>. Ein regulärer Ausdruck, der auf das Fluchtsymbol \ endet, stellt einen Fehler dar.
- Eine bracket expression ist eine List von Zeichen innerhalb von []. Alle Sonderzeichen inklusive des Fluchtsymbols \ verlieren ihre Sonderfunktion innerhalb einer bracket expression, es sei denn eine der folgenden Bedingungen trifft zu oder eine bestimmte Kombination mit ] liegt vor:
- Eine bracket expression erkennt die einzelnen umschlossenen Zeichen normalerweise als Treffer: [xyz] würde entweder ein einzelnes x, ein einzelnes y oder ein einzelnes y als Treffer erkennen.
- Sollten die umschlossenen Zeichen mit ^ beginnen, z.B. [^xyz], so findet eine Invertierung statt. Somit werden nur Zeichen als Treffer erkannt, welche nicht umschlossen sind.
- Sind zwei Zeichen innerhalb der Umschließung mit einem Bindestrich - verbunden, z.B. [a-f] oder [0-9], spricht man von einer collating sequence, welche alle Zeichen, die logischerweise zwischen dem einen und einschließlich dem anderen Zeichen liegen, als Treffer erkennt. Beginn und Ende nennt man endpoints; es darf immer nur zwei davon geben, [n-o-t] stellt einen Fehler dar.
- Um ein ] zeichengetreu als Treffer zu adressieren muss es an erster Stelle erscheinen: []xyz], ggf. als Negation [^]xyz] oder ohne weitere Zeichen.
- Um ein - zeichengetreu als Treffer zu adressieren muss es an erster oder letzter Stelle erscheinen: [-xyz] oderr [xyz-], oder als zweiter endpoint der logischen Zeichenfolge: [a-f-]. Um den Bundestrich als ersten Endpunkt zu definieren nutzt man [.-.] (somit ein collating element), was in der Gesamtheit folgendermaßen aussieht: [[.-.]a-f]
- Innerhalb einer bracket expression ist ein collating element:
- Ein Zeichen.
- Eine Zeichenfolge, welche sich als collating element verhält wie ein einzelnes Zeichen.
- Oder ein Name für eine Zeichenfolge, welche sich als collating element verhält, wie ein einzelnes Zeichen.
- Wenn ein collating element mit [. und .] umschlossen wird, gilt die Zeichenfolge von diesem collating element als Treffer.
- Die sich ergebende Zeichenkette ist ein einzelnes Element innerhalb der bracket expression.
- Beispiel: Der reguläre Ausdruck [[.ch.]]*c erkennt die ersten fünf Zeichen aus chchcc als Treffer.
- Ein collating element innerhalb einer bracket expression, welches durch [= and =] umschlossen ist stellt eine equivalence class dar:
- Eine equivalence class steht für die Zeichenfolge aller collating elements äquivalent zu dieser, sie selbst inklusive.
- Sind keine äquivalenten collating elements vorhanden, so wird der Ausdruck behandelt als würde eine Umschließung durch [. und .] vorliegen.
- Eine equivalence class darf nicht einen endpoint darstellen.
- Beispiel: Sind x und y Teil einer equivalence class, so sind [=x=], [=y=] und [xy] allesamt synonym.
- Eine equivalence class steht für die Zeichenfolge aller collating elements äquivalent zu dieser, sie selbst inklusive.
- Innerhalb einer bracket expression ist eine character class (jeweils umschlossen durch [: and :]):
- (kann nicht als endpoint genutzt werden; character classes haben ctype(3) als Grundlage und deren Man Page referenziert entsprechende Funktionen, welche von locale Einstellungen abhängen sowie Vorlieben bei der Implementierung anstatt einheitlicher Vorgaben)
- Ein einzelnes Zeichen einer character class wird als Treffer erkannt.
- alnum: [a-z], [A-Z] und [0-9]
- alpha: [a-z] und [A-Z]
- cntrl: Einige Steuerzeichen, z.B. EOT (end of transmission, oktaler Wert 004)
- digit: [0-9]
- graph: alnum und punct
- lower: [a-z]
- print: graph und " " (Leerzeichen)
- punct: ! " # $ % & ' ( ) + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
- upper: [A-Z]
- xdigit: Hexadezimale Zahlenbestandteile, d.h. [0-9], [a-f] und [A-F]
- space: "\t" "\n" "\v" "\f" "\r" " " (tab, newline, vertical tabulation, form feed, carriage return, space)
- blank: "/t" (tab) und " " (space)
- Example: [:alnum:] oder als Negation [^[:lower:]]
- Ein word im folgenden Sinne (Kontext: null string als word Trennzeichen) wird definiert als word-Zeichenfolge, welcher weder ein word Zeichen in Form eines alnum (siehe oben) oder ein Unterstriche voransteht noch nachfolgt.
- [[:<:]] matches the null string at the beginning of a word.
- [[:>:]]matches the null string at the end of a word.
- Eine bracket expression erkennt die einzelnen umschlossenen Zeichen normalerweise als Treffer: [xyz] würde entweder ein einzelnes x, ein einzelnes y oder ein einzelnes y als Treffer erkennen.
Regulärer Ausdruck um eine URL zu extrahieren
# HINWEIS: der HTML Quelltext enthält HTML Fluchtsymbole
grep -E '(((http|https|ftp|gopher)|mailto):(//)?[^ <>"\t]*|(www|ftp)[0-9]?\.[-a-z0-9.]+)[^ .,;\t\n\r<">\):]?[^, <>"\t]*[^ .,;\t\n\r<">\):]' myURLs.txt