regex
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| regex [2018-10-19 08:00:25] – [sed] manfred | regex [2022-03-03 12:58:19] (aktuell) – [extended regular expressions (ERE)] manfred | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== REGEX (REGular EXpression => Regulärer Ausdruck) ====== | ||
| + | |||
| + | * **[[https:// | ||
| + | * **// | ||
| + | * **[[https:// | ||
| + | * **[[http:// | ||
| + | * [[https:// | ||
| + | * [[http:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[http:// | ||
| + | * **[[http:// | ||
| + | * **[[http:// | ||
| + | |||
| + | Die "Basic REGEX" sind recht einfach, allerdings fehlen ihnen einige wichtige Funktionen. | ||
| + | Deshalb wurden die REGEX zu den " | ||
| + | Allerdings haben viele Softwarehersteller ihre eigenen erweiterten REGEX-Versionen veröffentlicht, | ||
| + | bevor die " | ||
| + | Und so kam es, dass es zur Zeit viele verschiedene erweiterten REGEX-Versionen gibt, | ||
| + | die bekannteste ist die " | ||
| + | |||
| + | > echo -e " | ||
| + | 76556 | ||
| + | 765567 | ||
| + | 65567 | ||
| + | 65567 | ||
| + | 6556 | ||
| + | |||
| + | |||
| + | ===== Grep ===== | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | |||
| + | ===== Reguläre Ausdrücke mit MySQL ===== | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | |||
| + | ===== basic regular expressions (BRE) ===== | ||
| + | |||
| + | Das ist die grundlegende Version der POSIX-REGEX. | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | Diese REGEX wird u.a. von " | ||
| + | |||
| + | Die //BRE// kennen keinen Platzhalter für ein Tabulatorzeichen, | ||
| + | stattdessen werden hier Leerzeichen erkannt! | ||
| + | |||
| + | __genau eine Ziffer:__ | ||
| + | [0-9] | ||
| + | |||
| + | __genau ein Zeichen, das keine Ziffer ist:__ | ||
| + | [^0-9] | ||
| + | |||
| + | __Zeilenanfang: | ||
| + | ^ | ||
| + | |||
| + | __Zeilenende: | ||
| + | $ | ||
| + | |||
| + | __genau ein beliebiges Zeichen:__ | ||
| + | . | ||
| + | |||
| + | __ein oder mehrere beliebige Zeichen:__ | ||
| + | .+ | ||
| + | |||
| + | __kein, ein oder mehrere beliebige Zeichen:__ | ||
| + | .* | ||
| + | |||
| + | __genau ein Punkt:__ | ||
| + | [.] | ||
| + | |||
| + | __mindestens ein Punkt:__ | ||
| + | [.]+ | ||
| + | |||
| + | __ein oder kein Punkt:__ | ||
| + | [.]* | ||
| + | |||
| + | __genau ein Leerzeichen: | ||
| + | [ ] | ||
| + | |||
| + | __mindestens ein Leerzeichen: | ||
| + | [ ]+ | ||
| + | |||
| + | __ein oder kein Leerzeichen: | ||
| + | [ ]* | ||
| + | |||
| + | __genau einmal irgendein Zeichen, nur kein "/": | ||
| + | [^/] | ||
| + | |||
| + | __mindestens einmal irgendein Zeichen, nur kein "/": | ||
| + | [^/]+ | ||
| + | |||
| + | __ein oder keinmal irgendein Zeichen, nur kein "/": | ||
| + | [^/]* | ||
| + | |||
| + | __m-fache Wiederholung von " | ||
| + | [x]\{m\} | ||
| + | |||
| + | __m..n-fache Wiederholung von " | ||
| + | [x]\{m,n\} | ||
| + | |||
| + | __m..? | ||
| + | [x]\{m,\} | ||
| + | |||
| + | wenn nur die Zahl '' | ||
| + | > echo -e " | ||
| + | 65567 | ||
| + | |||
| + | |||
| + | ===== Perl regular expressions (PCRE) ===== | ||
| + | |||
| + | Das ist die von Perl erweiterte REGEX-Version, | ||
| + | |||
| + | Diese REGEX wird u.a. von "grep -P" unterstützt. | ||
| + | |||
| + | In manchen Anwendungsprogrammen, | ||
| + | |||
| + | __Beispiel zur " | ||
| + | l.+o -> llo Wo | ||
| + | l.+?o | ||
| + | l.*o -> llo Wo | ||
| + | l.*?o | ||
| + | |||
| + | __kein oder ein beliebiges Zeichen:__ | ||
| + | .? | ||
| + | |||
| + | __genau ein Buchstabe oder eine Ziffer:__ | ||
| + | [0-9A-Za-z] | ||
| + | |||
| + | __genau ein Buchstabe: | ||
| + | [a-zA-Z] | ||
| + | |||
| + | __genau ein kleiner Buchstabe: | ||
| + | [a-z] | ||
| + | |||
| + | __genau ein großer Buchstabe: | ||
| + | [A-Z] | ||
| + | |||
| + | __genau eine Ziffer:__ | ||
| + | [0-9] | ||
| + | [\d] | ||
| + | |||
| + | __genau ein Zeichen, das keine Ziffer ist:__ | ||
| + | [^0-9] | ||
| + | [^\d] | ||
| + | [\D] | ||
| + | |||
| + | __genau ein Punkt, Komma oder Semikolon: | ||
| + | [.,;] | ||
| + | |||
| + | __genau ein Leerzeichen oder Tabulatorzeichen: | ||
| + | [ \t] | ||
| + | |||
| + | __genau ein Leerzeichen: | ||
| + | [ ] | ||
| + | |||
| + | __ein Tabulatorzeichen: | ||
| + | \t | ||
| + | |||
| + | __ein Zeilenumbruch im Unix-Format: | ||
| + | \n | ||
| + | |||
| + | __ein Wagenrücklauf (^M) => ein Zeilenumbruch im Mac-Format: | ||
| + | \r | ||
| + | |||
| + | __ein Zeilenumbruch im Windows-Format: | ||
| + | [\r\n] | ||
| + | |||
| + | __logische Verknüpfung " | ||
| + | | | ||
| + | |||
| + | __Gruppierung: | ||
| + | (...) | ||
| + | |||
| + | __ein Piepston:__ | ||
| + | \a | ||
| + | |||
| + | __ein Seitenvorschub: | ||
| + | \f | ||
| + | |||
| + | __ein vertikaler Tabulator: | ||
| + | \v | ||
| + | |||
| + | __Wortanfang bzw. Wortende:__ | ||
| + | \b | ||
| + | |||
| + | __alles, nur kein Wortanfang bzw. Wortende:__ | ||
| + | \B | ||
| + | |||
| + | __ein Buchstabe, eine Ziffer oder der Unterstrich: | ||
| + | \w | ||
| + | |||
| + | __ein Zeichen, das weder Buchstabe noch Ziffer oder Unterstrich ist:__ | ||
| + | [\W] | ||
| + | [^\w] | ||
| + | |||
| + | __ein Leerzeichen und die Klasse der Steuerzeichen: | ||
| + | [\s] | ||
| + | [\f\n\r\t\v] | ||
| + | |||
| + | __ein Zeichen, das kein Whitespace ist:__ | ||
| + | [\S] | ||
| + | [^\s] | ||
| + | |||
| + | wenn nur die Zahl '' | ||
| + | > echo -e " | ||
| + | 65567 | ||
| + | |||
| + | |||
| + | ===== extended regular expressions (ERE) ===== | ||
| + | |||
| + | Das ist die erweiterte Version der POSIX-REGEX. | ||
| + | |||
| + | Diese REGEX wird u.a. von " | ||
| + | |||
| + | Die //BRE// kennen keinen Platzhalter für ein Tabulatorzeichen, | ||
| + | stattdessen werden hier Leerzeichen erkannt! | ||
| + | |||
| + | __genau ein Buchstabe oder eine Ziffer:__ | ||
| + | [[:alnum:]] | ||
| + | |||
| + | __genau ein Buchstabe: | ||
| + | [[:alpha:]] | ||
| + | |||
| + | __genau ein kleiner Buchstabe: | ||
| + | [[:lower:]] | ||
| + | |||
| + | __genau ein großer Buchstabe: | ||
| + | [[:upper:]] | ||
| + | |||
| + | __genau eine Ziffer:__ | ||
| + | [[:digit:]] | ||
| + | |||
| + | __genau ein Zeichen, das keine Ziffer ist:__ | ||
| + | [^[: | ||
| + | |||
| + | __genau ein Hexadezimalziffer: | ||
| + | [[: | ||
| + | |||
| + | __genau ein sichtbares Zeichen:__ | ||
| + | [[:graph:]] | ||
| + | |||
| + | __genau ein druckbares Zeichen:__ | ||
| + | [[:print:]] | ||
| + | |||
| + | __genau ein Punkt, Komma oder Semikolon: | ||
| + | [[:punct:]] | ||
| + | |||
| + | __genau ein horizontaler und vertikaler Tabulator, Zeilen- und Seitenvorschub, | ||
| + | [[:space:]] | ||
| + | |||
| + | __genau ein Leerzeichen oder Tabulatorzeichen: | ||
| + | [[:blank:]] | ||
| + | |||
| + | __genau ein Steuerzeichen: | ||
| + | [[:cntrl:]] | ||
| + | |||
| + | __m-fache Wiederholung von " | ||
| + | [x]{m} | ||
| + | |||
| + | __m..n-fache Wiederholung von " | ||
| + | [x]{m,n} | ||
| + | |||
| + | __m..? | ||
| + | [x]{m,} | ||
| + | |||
| + | wenn nur die Zahl '' | ||
| + | > echo -e " | ||
| + | 65567 | ||
| + | |||
| + | |||
| + | ===== sed ===== | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | Leider verwendet '' | ||
| + | hier ein paar Besonderheiten: | ||
| + | |||
| + | __genau ein beliebiges Zeichen:__ | ||
| + | . | ||
| + | |||
| + | __mindestens ein beliebiges Zeichen:__ | ||
| + | .\+ | ||
| + | |||
| + | __ein oder kein beliebiges Zeichen:__ | ||
| + | .* | ||
| + | |||
| + | __genau ein Punkt:__ | ||
| + | [.] | ||
| + | |||
| + | __mindestens ein Punkt:__ | ||
| + | [.]\+ | ||
| + | |||
| + | __ein oder kein Punkt:__ | ||
| + | [.]* | ||
| + | |||
| + | __genau ein Leerzeichen oder Tabulator (white space):__ | ||
| + | [ \t] | ||
| + | |||
| + | __mindestens ein Leerzeichen oder Tabulator (white space):__ | ||
| + | [ \t]\+ | ||
| + | |||
| + | __ein oder kein Leerzeichen oder Tabulator (white space):__ | ||
| + | [ \t]* | ||
| + | |||
| + | __kein Leerzeichen oder Tabulator (white space) am Zeilenanfang: | ||
| + | ^\s\+ | ||
| + | |||
| + | __kein "/" | ||
| + | ^[^/]\+ | ||
| + | |||
| + | __alles, außer Bindestrich, | ||
| + | [^-+_.a-zA-Z0-9] | ||
| + | |||
| + | **Hierbei ist zu beachten, dass der Bindestrich als erstes und das Plus als zweites Zeichen angegeben werden!** Wird das Plus als letztes angegeben, dann muss es maskiert werden. Der Bindestrich wird von SED als Parameter interpretiert, | ||
| + | |||
| + | zum Beispiel kann man so Sonderzeichen aus Dateinamen gegen einen Unterstrich austauschen: | ||
| + | > echo ' | ||
| + | Unglaublich__Wenn_das_passieren_wÃ_rde__bestÃ_nde_kein_Funken_Hoffnung mehr_-+_._zukrassalter.txt | ||
| + | |||
| + | __Bitte beachtet, dass das " | ||
| + | |||
| + | 16-Bit-Zeichensätze sind im internationalen Standard [[https:// | ||
| + | Unicode enthälten u.a. die Kodierungen [[https:// | ||
| + | |||
| + | 8-Bit-Zeichensätze sind im internationalen Standard [[https:// | ||
| + | |||
| + | |||
| + | ===== Perl Compatible Regular Expressions (PCRE) ===== | ||
| + | |||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||
| + | hier ein Beispiel für ein Match: | ||
| + | |||
| + | kein Match | ||
| + | # perl -0ne 'print " | ||
| + | |||
| + | ein Match | ||
| + | # perl -0ne 'print " | ||
| + | / | ||
| + | |||
| + | |||
| + | hier ein Beispiel für ein UND-verknüpften Match: | ||
| + | |||
| + | kein Match | ||
| + | # perl -0ne 'print " | ||
| + | |||
| + | ein Match | ||
| + | # perl -0ne 'print " | ||
| + | / | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | In Perl werden reguläre Ausdrücke auf mannigfache Weise benutzt. Die einfachste Möglichkeit ist, zu prüfen, ob der Text in einer bestimmten Variablen auf einen regulären Ausdruck paßt. Das folgende Programmstück prüft den String in der Variable $reply und gibt aus, ob darin nur Ziffern vorkommen: | ||
| + | # | ||
| + | | ||
| + | $var = " | ||
| + | | ||
| + | if ( $var =~ m/^[0-9]+$/ ) | ||
| + | { | ||
| + | print "$var sind alles nur Ziffern\n"; | ||
| + | } else | ||
| + | { | ||
| + | print "$var sind nicht nur Ziffern\n"; | ||
| + | } | ||
| + | |||
| + | Soll nicht nur der erste Treffer modifiziert werden, dann muss am Ende der REGEX ein " | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | Wenn die Regex wahr ist, dann wird der Teil des Strings in $var, der auf den regulären Ausdruck gepaßt hat, durch Ersatz ersetzt. | ||
| + | # | ||
| + | | ||
| + | $var = " | ||
| + | | ||
| + | if ( $var =~ s/ | ||
| + | { | ||
| + | print "$var wurde ersätzt\n"; | ||
| + | } else | ||
| + | { | ||
| + | print "$var wurde nicht ersätzt\n"; | ||
| + | } | ||
| + | |||
| + | Soll nicht zwischen Groß- und Kleinschreibung unterschieden werden, dann muss man am Ende der REGEX ein " | ||
| + | |||
| + | |||
| + | ==== Parameter bzw. Argumente übergeben ==== | ||
| + | |||
| + | Will man auf der Kommandozeile Parameter übergeben, dann wird das erste im Perl-Script z.B. mit **'' | ||
| + | |||
| + | |||
| + | ===== Oniguruma regular expressions ===== | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | Bisher war //PCRE// die am weitesten verbreitete RegEx-Variante, | ||
| + | mittlerweile gewinnt aber eine neue Version immer mehr an Popularität: | ||
| + | |||
| + | Oniguruma ist ist eine RegEx-Bibliothek, | ||
| + | sie unterstützt ein sehr großes Spektrum an Zeichensätzen, | ||
| + | |||
| + | Sie wird in der Interpretersprache Ruby seit der Version 1.9 eingesetzt und in der | ||
| + | Interpretersprache PHP5. | ||
| + | Seit der Version 7.7 verwendet sogar //PCRE// ein Oniguruma-Konstrukt für Subroutinen. | ||
| + | |||
| + | Es wird ebenso in Produkten wie //Tera Term//, // | ||
| + | |||
| + | |||
| + | ===== problematische Sonderfälle, | ||
| + | |||
| + | Es bestand das Problem, dass in einem Skript überprüft werden muss, ob eine Zeichenkette numerisch ist oder ggf. Buchstaben enthält. | ||
| + | |||
| + | Leider funktioniert mit "'' | ||
| + | Also habe ich gedacht, eine negierende RegEx könnte helfen. | ||
| + | Wenn also nur Zeichen durchgelassen werden, die nicht // | ||
| + | |||
| + | Als Testobjekte sollen diese Zeichenketten dienen: | ||
| + | - '' | ||
| + | - '' | ||
| + | - '' | ||
| + | - '' | ||
| + | - '' | ||
| + | - '' | ||
| + | |||
| + | hiervon darf nur die erste ('' | ||
| + | |||
| + | |||
| + | mit // | ||
| + | > echo -e " | ||
| + | 123 | ||
| + | 1a | ||
| + | a1 | ||
| + | |||
| + | oder mit //extended regular expressions// | ||
| + | > echo -e " | ||
| + | 123 | ||
| + | 1a | ||
| + | a1 | ||
| + | |||
| + | Leider funktioniert keine von beiden richtig! :-( | ||
| + | |||
| + | nur diese RegEx funktioniert richtig (Quelle: [[https:// | ||
| + | > for A in 123 ABC Def ghi 1a a1 ; do if [[ " | ||
| + | 123 | ||
| + | |||
