# Muster-Erkennung

Beim Abrufen und Einstellen von Informationen in den Zeitzustand ist es möglich, komplexere Tasten zu verwenden als einfache Symbole wie `:foo` und `:bar`. Sie können auch Zeichenketten im URL-Stil verwenden, wie z.B. `"/foo/bar/baz"`. Sobald wir mit Pfaden arbeiten, können wir dann die Vorteile des ausgeklügelten Pattern-Matching-Systems von Sonic Pi nutzen, um `get` und `sync` mit `ähnlichen' und nicht mit` identischen’ Pfaden zu synchronisieren. Lass uns einen Blick darauf werfen.

## Erkennen von Pfad-Segmenten

Angenommen wir möchten auf ein Ereignis warten, das die folgenden drei Pfad-Segmente enthält:

    sync  "/*/*/*"

Hiermit kann man auf jegliches Time State Ereignis syncen, dass aus exakt drei Pfadsegmenten besteht, unabhängig davon, was genau der Inhalt der Segmente ist. Schauen wir uns das an einem Beispiel an:

- `cue "/foo/bar/baz"`
- `cue "/foo/baz/quux"`
- `cue "/eggs/beans/toast"`
- `cue "/moog/synths/rule"`

Allerdings wird es nicht auf Ereignisse “matchen”, die weniger oder mehr Pfad-Segmente hätten. Die folgenden würden nicht erkannt und damit kein Ereignis triggern:

- `cue "/foo/bar"`
- `cue "/foo/baz/quux/quaax"`
- `cue "/eggs"`

Jeder `*` bedeutet irgendein Inhalt. Das heisst, wie können Pfade mit nur einem Segment mit `/*` oder Pfade aus fünf Segmenten mit `/*/*/*/*/*` erkennen

## Erkennen von Teilsegmenten

Wenn wir wissen, womit das Segment beginnen oder enden wird, können wir zusätzlich zu einem Teilsegmentnamen ein `*` verwenden. Zum Beispiel: `"/foo/b*/baz"`passt auf jeden Pfad, der drei Segmente hat, von denen das erste `foo`, das letzte `baz` und das mittlere Segment alles sein können, was mit `b` beginnt. Also, es würde passen:

- `cue "/foo/bar/baz"`
- `cue "/foo/baz/baz"`
- `cue "/foo/beans/baz"`

Allerdings erkennt es nicht das Folgende:

- `cue "/foo/flibble/baz"`
- `cue "/foo/abaz/baz"`
- `cue "/foo/beans/baz/eggs"`

Du kannst das `*` auch an den Anfang des Segments setzen, um die letzten Zeichen eines Segments anzugeben: `"/foo/*zz/baz"`, das jedem 3-Segment `cue` oder `set` entspricht, wobei das erste Segment `foo` ist, das letzte `baz` ist und das mittlere Segment mit `zz` endet, wie `"cue "/foo/whizz/baz"`.

## Erkennen von verschachtelten Pfadsegmenten

Manchmal weiß man nicht, wie viele Pfadsegmente man zuordnen möchte. In diesen Fällen kannst Du den mächtigen Doppelstern: `**` wie `"/foo/**/**/baz"` verwenden, der übereinstimmt:

- `cue "/foo/bar/baz"`
- `cue "/foo/bar/beans/baz"`
- `cue "/foo/baz"`
- `cue "/foo/a/b/c/d/e/f/baz"`

## Erkennen von einzelnen Buchstaben

Du kann das `?` verwenden, um auf ein bestimmtes einzelnes Zeichen zu erkennen. `"/?oo/bar/baz"` passt auf:

- `cue "/foo/bar/baz"`
- `cue "/goo/bar/baz"`
- `cue "/too/bar/baz"`
- `cue "/woo/bar/baz"`

## Erkennen von mehrfachen Wörtern

foo

- `cue "/foo/bar/quux"`
- `cue "/foo/beans/quux"`
- `cue "/foo/eggs/quux"`

## Erkennen von mehrfachen Zeichen

foo

- `cue "/foo/aux/baz"`
- `cue "/foo/bux/baz"`
- `cue "/foo/cux/baz"`

foo

- `cue "/foo/aux/baz"`
- `cue "/foo/bux/baz"`
- `cue "/foo/cux/baz"`
- `cue "/foo/dux/baz"`
- `cue "/foo/eux/baz"`

## Kombinieren von Mustererkennungen

Wenn du `sync` oder `get` aufrufst, kannst du Mustererkenner in beliebiger Reihenfolge kombinieren um jedes beliebige Time State Event, das durch `cue` oder `set` erzeugt wurde zu erkennen. Lass uns ein verrücktes Beispiel anschauen:

    in_thread do
      sync "/?oo/[a-z]*/**/ba*/{quux,quaax}/"
      sample :loop_amen
    end
    sleep 1
    cue "/foo/beans/a/b/c/d/e/bark/quux/"

## OSC Mustererkennung

Für die Neugierigen, diese Regeln zur Mustererkennung basieren auf der Open Sound Control Spezifikation zur Mustererkennung, die hier im Detail erklärt ist: http://opensoundcontrol.org/spec-1_0