= Diese Seite =
http://www.guckes.net/vortraege/workshop.vim_regex.txt
von Sven Guckes workshop_vim_regex (at) guckes.net
Latest change: Mon Apr 14 06:10:00 CEST 2008

Heizölrückstoßabdämpfung

= Inhalt =

Ziel: Die Sprache der Muster anhand von Beispielen im Editor Vim erlernen.

= Hilfe =

Dieser Text orientiert sich auch an dem Hilfetext fuer Vim 7.1:

  :help usr_27.txt -> Search commands and patterns

= Muster / RE =

Wir benutzen Zeichen mit spezieller Bedeutung,
um nicht nur nach einem moeglichen Treffer zu suchen,
sondern nach einer *Menge* von moeglichen Treffern.
Eine solchen Suchanfrage entspricht einem *Muster*.

Ein technischer Begriff fuer die *Sprache* dieser *Muster*
ist "regulaerer Ausdruck" (regular expression, RE).

Man unterscheidet im wesentlichen diese Typen:
BRE = Basic    Regular Expressions
ERE = Extended Regular Expressions

= Suchen =

Text werden durch Zeilenenden
(End of Line aka EOL) unterbrochen
und dadurch erst in Zeilen geteilt.
Die Suche ist *zeilenorientiert*.
Die Treffer einer Suche sind
daher *Teil* einer Zeile.

Es gibt im wesentlichen drei unterschiedliche Zeilenenden:

    Macintosh:  CTRL-M          [0x0d]
  DOS/Windows:  CTRL-M + CTRL-J [0x0d 0x0a]
         Unix:           CTRL-J      [0x0a]

== Zeilenanfang (BOL) und Zeilenende (EOL) ==

  BOL:    ^
  EOL:    $

Muster: ^foo
Muster:  bar$

= Wortanfang + Wortende =

Muster:      \< bzw \>

Die Kommandos * bzw # suchen nach dem *aktuellen* Wort -
vorwaerts bzw rueckwaerts.

= Suche per Global Command =

Das "global" Kommando fuehrt ein Kommando aus
in allen Zeilen, welche das gegeben Muster *enthalten*.

Beispiele:
    :g/RE/p     print   Ausgabe der Treffer
    :g/RE/nu    number  Ausgabe der Treffer mit Zeilennummer

= Vim Highlight Search =

Anzeige der gefundenen Treffer:
    :set hls

Option umschalten (an/aus):
    :set hls!

Befehle auf ",10" legen:
    map ,10 :set hls!

Anwendung auf alle Nicht-Treffer
mittels ":g!" oder ":v":

Loeschen all Zeilen, die "foo" *nicht* enthalten.
    :g!/foo/d

Loeschen aller Zeilen, die *nicht* mindestens
ein beliebiges Zeichen enthalten:
    :v/./d
.. also ein Loeschen aller *leeren* Zeilen.

== Offset ==
:help 27.3

Offset by Line:         /wort/3

Offset by Character:
Setzen des Cursors am Ende des Musters
mitsamt eines "search offset":
    /foo/b+23
    /foo/e-42

== Wiederholungen ==
:help 27.4

Ungezaehlte Wiederholungen:
    Muster:     Treffer:
    /a*         {}  a aa aaa aaaa  ...
    /[ab]*      {}  a b  aa ab ba bb  aaa aab aba abb ...
    /\(ab\)*    {}  ab abab ababab abababab ...
    /ab\+           ab abb abbb abbbb ...

Spezifische Wiederholungen:
    /ab\{3,5}   abbb abbbb abbbbb

== Alternativen ==
:help 27.5

    /foo\|bar
    /eins\|zwei\|drei

== Mengen / Sets ==
:help 27.6 -> Character Range

Range: Bereich, Wertebereich, Wertemenge, hier: Zeichenmenge.

Menge:
    /[a-z]
    /[0123456789abcdef]
    /[0-9a-f]

Komplementaermenge:
    /[^a-z]
    (finger|ftp|http|news|telnet)://[^ >]*

Vordefinierte Mengen:
    \a      Alphabet    Buchstabe
    \d      Digit       Ziffer
    \s      Space       "Weisses Zeichen"

    \l      lowercase alpha     kleiner Buchstabe
    \u      uppercase alpha     grosser Buchstabe

== Zeichenklassen ==
:help 27.7   ->  Character classes

    \f  file name   character
    \i  identifier  character
    \k  keyword     character
    \p  printable   character

== Zeilenenden ==
:help 27.8   ->  Matching a line break

Vim kann auch Muster auffinden, die eine Zeilenende *enthalten*,
dh das Ende des Treffers kann auch auf der naechsten Zeile sein.

= Beispiele =

Diese folgenden Beispiele wurden fuer den
PHP Kurs von Frank Hofmann zusammengestellt.

== Zeit HH:MM ==

Muster: [0-9][0-9]:[0-9][0-9]h
Muster:       \d\d:\d\dh
aber:   42:67 ist dann ebenfalls eine gueltige Zeitangabe. :-(

besser:
Muster: [012][0-9]:[0-5][0-9]h
aber:   29:59 ist ebenfalls gueltig.

besser: Stunden nur von 00 bis 23:
Muster: ([01][0-9]|2[0-3])\(:[0-5][0-9]\)*

besser: Trenner ist Punkt oder Doppelpunkt,
        mit Angabe von "am", "pm" oder 'h':
Muster: ([01]\?[0-9]|2[0-3])\([.:][0-5][0-9]\)\?(am|pm|h)\?

== Datum ==

Muster:     YYYY-MM-DD
Beispiele:  1967-04-06
            1977-10-26
            1999-12-31
            2000-01-01
            2008-04-14

Muster:     \d\d\d\d-\d\d-\d\d
Kritik:     vieeel zu allgemein.

Muster:     \(19\|20\)[0-9][0-9]-\(0[0-9]\|1[012]\)-\([012][0-9]\|3[01]\)
Muster:     \(19\|20\)\d\d-\(0\d\|1[012]\)-\([012]\d\|3[01]\)
Kritik:     YYYY-02-30 ist auch ein gueltiges Datum.

== Emailadresse ==

Regeln:     Adresse ist UNabhaengig von GROSS/kleinschreibung ("case").
Username    darf enthalten: Minus+Plus, Unterstriche, Ziffern und Punkte.
Hostname    darf enthalten: Minus+Plus, Unterstriche, Ziffern - aber keine Punkte.
TLD         (Top Level Domain) mindestens zwei bis maximal vier Buchstaben.
Muster:     [-_.+a-z0-9]\+@\([-a-z0-9].\)\+.[a-z]\{2,4\}

Alternative: TLDs aufzaehlen (ca 250).  homework. ;-)
edu gov mil | com net org | biz info name | asia eu us | aero coop museum pro

== Internetadresse ==

Muster:
\(\(1\?[0-9]\?[0-9]\|2[0-4][0-9]\|25[0-5]\)\.\)\{3}
  \(1\?[0-9]\?[0-9]\|2[0-4][0-9]\|25[0-5]\)

Beispiele:
    127.0.0.1
    10.10.10.10
    192.168.1.1
    192.109.42.123
    telnet 130.133.1.10 13

== Woerter ==

Muster:     \w\+  bzw  \W\+

= Suchen+Ersetzen =

Loeschen des Leerraumes (whitespace) am Ende aller Zeilen:
        :%s/\s\+$//

Binden des Kommandos an die Kombination ",9":
map ,9  :%s/\s\+$//
Akzeptieren/Ausfuehren mit ENTER/RETURN -
oder Abbrechen mit CTRL-C bzw ESC.

Substituieren mit dem Kommando ":s":
Grundeinstellung: Nur Substitution des *ersten*
Treffers.  Danach Wechsel zur naechsten Zeile.
Daher gibt es auch die folgende "flags":
    c   "confirmation"  Bestaetigung    Frage bei jedem Treffer nochmal nach
    g   "global"        "ganze Zeile"   Suche nach allen weiteren Treffer in der Zeile

Text loeschen:      :%s/blah//
Text einfuegen:     :%s/eins/eins und zwei/

Hinzufuegen am Anfang der Zeile:
    :s/^/foo/

Hinzufuegen am Ende   der Zeile:
    :s/$/foo/

Erhalten des Treffers mittels '&':
    :%s/foo/bar&/   -> barfoo
    :%s/foo/&bar/   -> foobar
    :%s/foo/&&/     -> foofoo

= Spezial =

Substitution bei ueberlappenden Mustern:

         a.*c
      v-------v
Text: aaabbbcccddd
         ^-------^
            b.*d

Loesung: Verbindung aus ":global" und ":subst":
    :g/b.*d/s/a.*c/XXX/

= :Global =

Anwendung des ":global" Kommandos in Verbindung
mit weiteren Kommandos der Kommandozeile:
:g/RE/d         delete  loesche     Treffer
:g/RE/co $      copy    kopiere     Treffer ans Pufferende
:g/RE/mo $      move    verschiebe  Treffer ans Pufferende
:g/RE/ya a      yank    kopiere     Treffer ins Register 'a' (ueberschreibt!)
:g/RE/ya A      yank    kopiere     Treffer ins Register 'a' (fuegt an)

Bei Verwendung des kleinen Buchstabens ueberschreibt ein erneuter Treffer
jeweils den Inhalt des Registers; der letzte Treffer "gewinnt" also
und ist damit der alleinige Inhalt des Registers nach dem Ablauf.

Bei Verwendung des *grossen* Buchstabens wird jeder Treffer
an das Register *angehaengt* (Sammeln aller Treffer).

= :g + :s =

Die Kombination der Kommandos :global und :subst
erlaubt Aenderungen in Abhaengigkeit von Treffern:

Auskommentieren der Debug Zeilen, dh jene,
die eine Ausgabe mittels "echo" erzeugen:
    :g/echo/s/^/#

Aenderungen nur in kommentierten Zeilen:
    :g/^\s*#/s:foo:bar:

== Digraph Input =
Eingabe von speziellen Zeichen:

Eingabe per ASCII Nummer:
-> :help i_CTRL-V
         i_CTRL-V 233 -> é

Eingabe per Digraph Kommando:
-> :help i_CTRL-K
         i_CTRL-K  a : -> ä

Eingabe per Digraph mit Ueberschreiben
des ersten Zeichens per "backspace":

    s CTRL-H s -> ß

Diese Eingabemethode geht aber nur mit
    ":set digraph" -> :help 'digraph'

Uebersicht der Digraph Kombinationen:
    :dig

= Hinweis =

Muster kann man auch bei diesen Programmen verwenden:

  Programm  Beschreibung
  agrep     search a file for a string or regular expression,
              with approximate matching capabilities
  bash      GNU Bourne-Again SHell (-> Pathname Expansion)
  gawk      pattern scanning and processing language
  grep      print lines matching a pattern (finde Suchmuster in Dateien)
  less      "opposite of more" (text pager)
  mutt      The Mutt Mail User Agent (colorize folder index and messages)
  perl      Practical Extraction and Report Language
  sed       stream editor for filtering and transforming text

Genau genommen erlauben alle guten Editoren, Shells,
und Programmiersprachen die Verwendung von Mustern. :-)

== Uebungen ==

Vorbereitung:
    :edit http://www.guckes.net/vortraege/workshop.vim_regex.txt
    :set hls

Suchanfragen:
    /^=.*=$
    /http:.*
    /:help

    :g/Muster
    :g//nu

    :/^= Links/,$d

= Links =

Regulaerer Ausdruck
http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck

Perl Compatible Regular Expressions
http://de.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions
http://de.wikipedia.org/wiki/PCRE

Jeffrey Friedl's Mastering Regular Expressions
http://regex.info/

Pattern (Java 2 Platform SE v1.4.2) - regex
http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html

Regex for URLs
http://www.foad.org/~abigail/Perl/url2.html

C-SLang documentation (regex, too)
http://www.macroexpressions.com/doc/snob/snobre.htm

------------------------------------------------------------------------

FoxyProxy - Filtern von Suchanfragen ueber einen Proxy
http://foxyproxy.mozdev.org/quickstart.html

Regular Expression Tutorial and Reference
http://www.regular-expressions.info/
One of the most comprehensive, free regular expression tutorials on the net.

RegexAdvice.com
http://regexadvice.com/
Forums and blogs dedicated to regular expressions.

Regular Expression Library
http://www.regexlib.com/
Currently contains over 1000 expressions from contributors around the world.

Using Regular Expressions
http://etext.lib.virginia.edu/services/helpsheets/unix/regex.html
Brief introduction to regular expressions

Regular Expression Cheat Sheet
http://regexlib.com/cheatsheet.aspx
A one page printable reference for regular expressions

Regular expressions:
http://rudd-o.com/projects/wp-search-replace/wp-search-replace-regexptut/
a short tutorial A five-minute tutorial on how to learn the most useful regular expressions

A List of Regex Topics
http://wiki.castlecops.com/A_list_of_Regex_topics
Wiki with various topics about regular expressions.

Mastering Regular Expressions
http://www.regex.info/
Official website for Jeffrey Friedl's book.

Regenechsen
http://www.regenechsen.de/phpwcms/index.php?regex_englisch
Beginners regular expression tutorial with exercises.
(auch auf Deutsch)

How to Find or Validate an Email Address
http://www.regular-expressions.info/email.html
EOF